ARC 087 参加記録
CombNaf、明日!!!!
さて、DまでACしたので解説書いて明日の準備します。
ただ、D問題まで行くの時間かけて負けです負け。
明日CombNafなので準備したいですね。
あとyukicoderの Advent Contest、私の担当が明日ですので、
このあと、yukicoderも良ければ覗いてください。
(あの問題は、私の後輩に身に着けて欲しいテクニックで解ける問題を出題しました)
C問題
- まずソート。
- 種類を数える
- 数えた種類がその数と同じでないときに処理を挟む
- その数より多いときは差の分だけ
その数より少ないときは個数分を
ansに足し算 - おわり。
D問題
が類題です、
DPでメモする意味がわからなかったが、添字メモったら一発で通ってクソかよwwwwwとなりました。
boolDPを書いてしまいました。
- まず、X座標とY座標を分解します。
- Tが出てきたらX座標とY座標を交換する
要は FFF T FF T F T Fなら(X座標3,1:Y座標2,1)分動ける
(プラマイどっちにも行けるが、初手Xだけプラスのみ) - ここで a+or-b+or-c+or-... =X(Y)にできるかどうかのDPをする
- DP(int a,int b)と取ったときに、aが何個目を見ているか、bがa-1個目までの和を表しています。
- それをやるとうまくいきます
- XのDPは(1,A[0])としないと初手マイナスという不適なものをカウントしてしまうのでNG。YのDPはDP(0,0)でOK
こんな感じです。
詳しくはソースを読んで下さいな。
Submission #1878367 - AtCoder Regular Contest 087
おまけ。レート
perf. : 1593
rate : 1240 (+48) highest!!
水色になれました。ありがとうございます!!!!!
ABC 080 参加記録。
ごめんなさい。
ちょっと今回は雑です。時間ないので。
A問題
ans=min(B,N*A);
B問題
cin>>S; N=stoi(S); for(auto x:S){ A+=int(x-'0'); } cout<<(N%A==0?"Yes":"No");
C問題
日本語読めませんでした。
要はやるやらないを10コマ試せば良い
2^10(ただし全部やらない1通りを引く)分だけ全探索。
Bitですね。
D問題
これを丁寧に書きたい。
いもす法 を使って終わりですね。(いもす法解説ページのリンク)
0.5なので、2倍したらいい感じになる。...さて。私は別の解き方でときました。
私は普通にいもす法をした後に、開始終了時刻をチャンネルごとにsetにぶち込み、録画が終わる時間で、次の録画が同じチャンネルかどうかをsetで調べました。
同じでない場合はtemp++をして加算します(録画機を増やすしかないため)
最後は ansとA[i]+tempで最大値比較
とやるとかぶりを発掘できてうまくやれます。
暇ができたら丁寧に書きますね。
わからなかったら @Nafmo2 まで聞いてくださいな。
おまけ。レート。
はい。
perf. : 1370
rate : 1176 (+24) highest!!
ABC 079 参加記録
全完じゃああああああああ
お久しぶりです、全完さん。
わかりやすさを心がけていきたいですね。
デザイン簡略化していきまーす
A問題
後ろ3桁は1000で割ったあまり。
前3桁は10で割ればいい(切り捨てなので)
三項演算子を用いて
((A/10)%111==0||(A%1000)%111==0)?"Yes":"No";
B問題
素直に書きました
if(0,1)だけ例外処理
ans=a+b
b=a,a=ans;
を回しまくります。
long longに変数を統一しないとオーバーフローします(int 混ぜないでね)
C問題
A+-B+-C+-Dを素直にべた書きしてください。こっちのほうが早いです。
私は、Bit全探索を書きました。
scanf("%1d%1d%1d%1d",&a,&b,&c,&d);
— 竹雄@CODE THANKS FESTIVAL2017 (@takeo1116) 2017年11月18日
で1文字ずつ取っていけ
参考情報
D問題
問題概要と解釈
- 書いてあるすべての数を1にしたい。
- 全体でいくらコストかかるか求めよ。
- 1になれるのはすべての数。
- コストが羅列されている
- あれ?これ、グラフっぽくないか?
- 一番小さいコストを求める、ということは、
どこか経由してもいいから、結果1にできればいいよね。 -
あれ?全部の頂点との最短距離求められるのでは?
- 各頂点から1までの距離が、コストでは...?
- できるじゃん!!!
というわけで、ワーシャルフロイド書きます。
で、ワーシャルフロイドの解説は別で書くかもしれません
https://t.co/Bn2UViFKP7
— eiya@受験競プロC++ (@eiya5498513) 2017年11月18日
このコードコメントがあって分かりやすいです。
ワーシャルフロイドはDP[i][j][k] = 頂点[1,k],i,jのみを使ったときの、i->j最短路です。
なので、DP[i][j][k] = std::min(DP[i][j][k], DP[i][k][k-1]+DP[k][j][k-1])になり、これにメモリ節約テクを使うとああなります。
このリンクのソースは私のソースだった()
ワーシャルフロイド回して、d[a][1]を平面操作します(aは書いてある数値(-1はスルーする))
これで通せます。
おまけ。レート。Highest
わーい
JOI 2010 本選 3 つらら
え?私覚醒した?
†DP†で通しました。
解法書きまーす
問題概要
- N本つららが並んでいます
- 両脇のつららよりながければ、1cm/hで伸びる
- Lまで行くと折れる
- さて全部折れるまで何時間?
-
https://www.ioi-jp.org/joi/2009/2010-ho-prob_and_sol/2010-ho.pdf
解法
両脇が折れる時間+L-今見てるところの長さでその見てるところの長さは出せる
じゃあどうするか。再帰っぽい。
あれ?DPじゃね?
空からDP解法が降ってきた。
両脇より高ければ L-A[i]でreturn
どっちも高かったら低い方だけ見ればいい
どっちかだけ高かったら高い方だけみればいい
みたいなことやって全探索したら幸せになれました
DP解、つらい。
でもなんかできて嬉しかった。
プライオリティーキュー解もあるのでそっちも考えてみるといいかもです