ABC198参戦記
はじめに
2021年4月11日21:00-22:40に開催されたABC198に参戦しました。
結果は103分52秒4完3ペナで1759位/8172人中。
パフォーマンス1152でレーティングは前回817から39上がって856でした。
直近4連続で冷えていたので久しぶりに温まってよかったです。
A問題
N個のお菓子を2人で両者とも最低1個以上になるような分け方を求める問題です。
簡単でしたが一応サンプルにも目を通してAC。
1分04秒
B問題
Nを十進数で表した文字列の先頭に0を0個以上つけて回文にできるかという問題。
末尾の0を取った残りの文字列が回文かどうかで判定しました。
7分35秒 通算8分39秒はまあまあ。
#include <bits/stdc++.h> using namespace std; typedef long long ll; #define rep(i,n) for(int i=0;i<n;i++) int main(){ string s; cin>>s; int len=s.length(); while(1){ if(s[len-1]=='0'){ s=s.substr(0,len-1); len--; continue; } break; } rep(i,len){ if(s[i]==s[len-1-i]) continue; cout<<"No"<<endl; return 0; } cout<<"Yes"<<endl; return 0; }
C問題
点(X,Y)までユークリッド距離Rを何回でいけるかという問題です。
距離が1回分より小さい時に2回かかるのがコーナーでした。
誤差がちょっと怖かったですが単純にceilとってACできました。
少し手間取りましたが通算27分17秒。
#include <bits/stdc++.h> using namespace std; int main(){ double r,x,y; cin>>r>>x>>y; double ans=ceil(pow(x*x+y*y,0.5)/r); if(ans==1 && x*x+y*y != r*r){ cout<<2<<endl; return 0; } cout<<setprecision(18)<<ans<<endl; }
D問題
10桁までの数2つを足す覆面算です。
今の実力では厳しいかと思いましたが典型っぽい問題だったのでぐぐったところAOJ1161を見つけました。
https://judge.u-aizu.ac.jp/onlinejudge/description.jsp?id=1161&lang=jp
AOJ1161は8ケタまでの数を2~7個足す問題で使う文字が大文字,出力が成立する組み合わせの数を出力する,という点が本問と異なります。
AOJの正解コードから理解しやすいやつを捜して加工しました。
next_permutationを使って全探索するのがオーソドックスそうです。
組み合わせの数を出力するのに変えて成立した場合にその場合の数字を出力するようにすること、組み合わせの数が0だった場合に”UNSOLVABLE”を出力すること、足し合わせる数を2つにすること、覆面につかう英文字を小文字にすること、といったアレンジをしていい感じになりました。
文字の組み合わせが10種類となった場合に”UNSOLVABLE”にする点に気づきWAケースは1つのみになりました。
最後に気づいたのは10桁同士の足し算なのでint型に収まらないケースがあることで#define int long longを使ってAC.
Submission #21686740 - AtCoder Beginner Contest 198
時間はかかりましたがACできてよかったです。
61分35秒 通算88分52秒。
おわりに
E問題に入ったところで残り10分ほどでした。
解法が見えずに時間切れでした。
まだまだ足りないところばかりですが手応えのある結果でした。技を磨いてスピードをつけること、高難易度の問題に恐れず挑める力をつけることを念頭に、引き続きがんばります。
4月になって新入学の大学生など参加者が増えてくるとレートを伸ばしやすくなるのではないかとちょっと期待しています。