AtCoder ABC 158 復習メモ

A - Station and Bus


よくわからないですがサンプルを見るに
uniqueしてサイズが1じゃなければ "Yes" すればよさそうです。ほんまか

#include <bits/stdc++.h>
using namespace std;

int main() {
  string S;
  cin >> S;
  S.erase(unique(S.begin(), S.end()), S.end());
  cout << ((S.size() != 1) ? "Yes" : "No") << "\n";
}

最近は最近の問題の類題が多い感じがしてきました

B - Count Balls


10000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000回繰り返すというところから大体算数の問題であることが察せられます

N / (A + B) * A はいいとして余った部分をどうカウントするか難しいです
(よく max と min を間違える)
あとA個の赤いボール、B個の青いボールと勘違いしていて逆を出力しようとしていました
危ない危ないと思いつつ訂正して提出 → int になっとるやんけ!(死亡)

#include <bits/stdc++.h>
using namespace std;

int main() {
  long N, A, B;
  cin >> N >> A >> B;
  cout << N / (A + B) * A + min(A, N % (A + B)) << "\n";
}

B問題までは long は必要ないという先入観があり油断しきっていました…
令和Bでは存在しないと思っていましたが確認したら1つありました(ABC149 B)
だめじゃん

変な先入観を持つ方が悪いですがA個の青いボールは良くないです(何が

C - Tax Increase


1行目で二分探索の構えをとりましたが制約の驚きの小ささ
電卓を叩くと1250位まで探索すればよさそうなので2000まで全探索しました
B問題とC問題、swapしていいのでは…(そうか?

#include <bits/stdc++.h>
using namespace std;

int main() {
  int A, B;
  cin >> A >> B;
  for (int i = 1; i < 2000; i++) {
    if (int(i * 0.08) == A && int(i * 0.1) == B) return cout << i << "\n", 0;
  }
  cout << -1 << "\n";
}

数値型を掛け算すると型の小さい方を大きい方に合せて勝手に変換するそうです
int と double を掛け算すると double の方が型が大きいので
int が double に変換(暗黙のキャスト)されて double * double になり
double が返ってきます
それをまた int に明示的にキャスト(小数点以下切り捨て)して比較します
みたいなことを最近習ったので得意げに書いています

D - String Formation


なにかの間違いで通らないかなと問題文の通り書いて提出
恐ろしい回数の reverse が行われて無事に死亡しました。アホかな?

というわけで毎回 reverse しなくて済むよう
クエリを (char, 前か後ろか, (その時)表か裏か) のタプルで溜めて
一気に処理してみましたが S + C or C + S していたらTLEに。なんてこったい
C + S が遅いらしく insert していれば普通に通ったようです

というわけで L + C or R + C していって
最後に L + S + R すれば 34ms で通りました

タプルとか要らないので書き直し

#include <bits/stdc++.h>
using namespace std;

int main() {
  string S;
  int Q;
  cin >> S >> Q;
  bool rev = 0;
  string L, R;
  while (Q--) {
    int T;
    cin >> T;
    if (T == 1) rev = !rev;
    else {
      int F;
      char C;
      cin >> F >> C;
      if (F - 1 + rev == 1) R += C;
      else L += C;
    }
  }
  reverse(L.begin(), L.end());
  S = L + S + R;
  if (rev) reverse(S.begin(), S.end());
  cout << S << "\n";
}

入力例2で人の温かさに触れました

E - Divisible Substring


一応解説動画を見てふむふむとはなったのですが
これを本番中に気付いて通せるようになる未来が見えない…



~ fin ~