cmat日記(競技プログラミングその他)

AtCoderはじめました (id: cmat)

精進記録: ABC1 - ABC6 C問題

f:id:cmat-comp:20190210161837p:plain


ABC-C終了!

 

ABC1が非常にアレな問題だったので後味は悪い。

正直C問題から得るものはC++での実装のテクニックとSTLの使い方以外はあまりなかった。ABC41以前の高難易度問題はそれなりに勉強になったが。

 

ということで新方式以降のABC-D埋めに移行することにする。

 

 

Educational DP Contest / DP まとめコンテスト
というのがあった。DPの経験不足は自覚しているので、D埋めと並行してやっていきたい。
 
 
まだ何もアナウンスされていないが、来週末はratedコンテスト無いのだろうか。
 
ARCはもう4ヶ月以上行われていない。 https://atcoder.jp/contests/
ARCの代わりとして企業コンが行われているという感じ?
なら日立コンをratedにしてほしいが。
 
 
 
C/C++をまともにやり始めたのが12月の末。
一応の目標は半年後の6月末までに青に到達すること。可能か?
 
過去の開催スケジュールを見た感じでは、最近1200以上でratedなコンテストの数が少ない。ratedコンテストが最近の月1-2回ペースだと、青パフォ後半を狙っていかないと厳しいかもしれない。参加回数補正が強すぎる。
 
裏技的だけど、rate 1200を超えないようにbeginnerコンテストで成績調整して参加回数を稼ぐ方が近道だったりするのかもしれない。
 
 
 
 
 
 
 
以下、C問題解答メモ。
 
 
ABC6 464
 
つるかめ算ってやつですか。中学受験組にはおなじみなのかもしれない(知らん)。
-1 -1 -1のケースを予め省いておけば、
M -3*Nを計算して負なら足が余ってるのでその分2本足に変更、正なら足が足りないので4本足に変更するだけ。
-> 一発AC
 
464点は明らかに過大評価では?
 
 
ABC5 302
 
売れるたこ焼きをキューで管理する。
寿命の尽きたものはpop()。
 
客が来た時点でキューが空ならno。
-> 一発AC
 
 
ABC4 309
 
10^9実行するのは不可能。
i = 0,1, 2 ,3 ,4 
で全体がcyclicに左回転する。
 
ということは、N/5回のrotationと, N - (N/5)*5回の入れ替えをすればいい。
 
i 回のrotationでどうなるか。これは6回で一周するので
 
(N/5)/6 *6回でもとに戻る。
 
結局、 N/5 - (N/5)/6 *6回の左回転とN-N/5 *5回のswapでok.
 
-> 一発AC
 
 
ABC3 323
 
レートの大きいK個の動画を見るのが良いのは間違いないが、どの順番で見るべきか。小さい方から見ていけば増やしていける。逆だと減りうる。
 
greaterでソートして video[K-i-1]をi=0,,.., K-1の順で見ればいい。
 
-> 一発AC
 
 
ABC2 265
 
v1, v2が貼る平行四辺形の面積がdetなので、その半分。
-> 一発AC
 
 
 
ABC1 589
 
ラスボスで点数高いけど、処理が面倒なだけなのでは?
191.25を181.25と打ち間違えていて1WA。
何を競う大会だよこれ。
 
初めての大会でこれ出てたら競プロやめる気がする。
 
 
if文はコードがキモいことになるのが目に見えているので三項演算子で処理。
ちゃんと改行しておけば可読性も良い。
 
    stringDir;
    Deg/=10;
   
    Dir = (Deg<11.25)? "N":
    (Deg <33.75)? "NNE":
    (Deg <56.25)? "NE":
    (Deg <78.75)? "ENE":
    (Deg <101.25)? "E":
    (Deg <123.75)? "ESE":
    (Deg <146.25)? "SE":
    (Deg <168.75)? "SSE":
    (Deg <191.25)? "S":
    (Deg <213.75)? "SSW":
    (Deg <236.25)? "SW":
    (Deg <258.75)? "WSW":
    (Deg <281.25)? "W":
    (Deg <303.75)? "WNW":
    (Deg <326.25)? "NW":
    (Deg <348.75)? "NNW":
    "N";
   
   
    Dis/=60;
    Dis = round(Dis*10);
 
    intW;
    W = (Dis <=2)? 0:
    (Dis <=15)? 1:
    (Dis <=33)? 2:
    (Dis <=54)? 3:
    (Dis <=79) ? 4:
    (Dis <=107)? 5:
    (Dis <=138)? 6:
    (Dis <=171)? 7:
    (Dis<=207)? 8:
    (Dis<=244)? 9:
    (Dis <= 284)? 10:
    (Dis<=326)? 11:
    12;
 
 
後味は最悪だが、これでABC-Cは全て解いた。