yamake's blog

主に競プロ、たまに自転車

Codeforces Round #603 div. 2

今日はこの回をやりました。

A~Dの4完です

 Aから少しつまづいてしまいました

 

A問題は数字が大きい順にa,\ b,\ cとします。

b+c\leq aであれば答えはb+cです。

 

そうでなければ、bcの差分が1となるようにab,\ cのペアを作ります。

次に残ったbcの小さい方の大きさ分だけペアを作れます。

こうすることによって、最後のbcの差が1の時以外は全て使い切ることができます。

 

A問題なので場合分けせずに早く通したいと思い、

cout<<min(a[2],a[1]+a[0])+max(0,(a[0]+a[1]-a[2])/2)<<endl;

(配列{a}は昇順ソート、2項目の右側でbcの差分が1の時切り捨てる処理をしています。)

を投げました。

 

B問題

nが10以下だったので、仮に全部同じPINだったとしても、それぞれ1文字ずつ変えるだけで大丈夫です。

あとはどこを変えるかと、何に変えるかを全探索して良いです。

 

C問題

こういうのは\sqrt{N}まで全探索したら大丈夫なんですね~~。という気持ちで\sqrt{N}までを全探索したら通りました。

 

商とあまりの大小関係を考えると証明ができそうな気がしているのですが、まだ詰め切れていません......

 

D問題

これはaが入っている文字列、bが入っている文字列、...、zが入っている文字列と

それぞれの英小文字ごとにUnionFindをしていくとできて、計算量はO(N\times 26\times \alpha(N))(この記法あってますか...?)になります。