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
わーい