AtCoder Beginner Contest 297 に参加しました&反省会
AtCoder Beginner Contest 297 の振り返り
- C問題まで解けました
- A問題:ダブルクリックが成立した時刻を変数に格納後、ループから抜けます
- B問題:対応する文字の出現位置を格納する変数を用意し条件を満たすかを調べます
- C問題:TTと連続する部分文字列をPCに置き換えます
- D問題:問題文中の減算する処理を除算に置き換えることで計算量を削減します。WAがつ出ました
B問題
方針
B
,K
,R
それぞれの出現位置を変数に格納します- 与えられた条件を満たすかを判定します
解説*1から
- 条件の偶奇が異なるとは
%2
で得られる余りが一致するかどうかで判定します - 条件は問題文の通りです
- 出現位置を取得するには
find
,rfind
関数を使います
実装例
#include<bits/stdc++.h> using namespace std; int main () { string S; cin >> S; int b_left = S.find('B'); int b_right = S.rfind('B'); int r_left = S.find('R'); int r_right = S.rfind('R'); int k = S.find('K'); bool flag = true; if (b_left % 2 == b_right % 2) flag = false; if (!(r_left < k && r_right > k)) flag = false; cout << (flag ? "Yes" : "No") << endl; return 0; }
C問題
方針
S
を左から見ていき、T
が個連続しているならばPC
で置き換えるという操作を行います
解説*2から
- 指定した文字列または正規表現にマッチする全ての部分文字列を置換します
regex_replace
関数を使います
実装例
#include<bits/stdc++.h> using namespace std; int main () { int H, W; cin >> H >> W; for (int i = 0; i < H; i++) { string S; cin >> S; cout << regex_replace(S, regex("TT"), "PC") << endl; } return 0; }
D問題
方針
- 問題文中の減算する処理を除算に置き換えることで計算量を削減します
解説*3から
- はじめに、になるように
swap
を行います。 - になるまで以下を繰り返します。
- 答えにを足し、をで置き換えます。
- を
swap
します。 - 最後に答えからを引きます。
- 元の操作でのの大小関係が同じ操作を一度にまとめて行っています。最後にを引くのはとなったとき更に回多く操作をしてしまうからです。
- 計算量はです。
実装例
#include<bits/stdc++.h> using namespace std; int main() { long long a,b; cin>>a>>b; long long ans=0; if(a<b) swap(a,b); while(b>0){ ans+=a/b; a%=b; swap(a,b); } cout<<ans-1<<endl; }