ABC192に参加しました
AtCoderのコンテストに参加した際の結果と考え方、反省点などを書いていきます。
コンテストページはこちら
解いた/挑んだ問題
A問題
問題の概要
ある数が与えられます。
より大きい100の倍数との差はいくつありますか?
制約
どのように考えたか
答えが1~99なので、for文でに1ずつ足していきながらが100の倍数になったときまでの加算した値が答え
結果
1発AC
・提出したコード
#include<bits/stdc++.h> #include<atcoder/all> #define rep(i, n) for (long long i = 0; i < (long long)(n); i++) #define REP(i,v,n) for(long long i = v; i <= (long long)(n); i++) #define rrep(i,n) for(long long i = n;0 <= (long long)(i); i--) #define RREP(i,n,v) for(long long i = n;v <= (long long)(i); i--) #define all(v) v.begin(), v.end() #define rall(v) v.rbegin(), v.rend() template<class T> inline bool chmax(T& a, T b) { if (a < b) { a = b; return 1; } return 0; } template<class T> inline bool chmin(T& a, T b) { if (a > b) { a = b; return 1; } return 0; } using namespace std; using namespace atcoder; using ll = long long; using pi = pair<int, int>; ll pows(ll x, ll n) {ll ret = 1;while (n > 0) {if (n & 1) ret *= x;x *= x;n >>= 1;}return ret;} int main() { int a,cnt=0; cin >>a; rep(i,1000){ a++; cnt++; if(a%100==0)break; } cout << cnt << endl; return 0; }
問題の誤読をしなくてよかった
ACまでの時間
ACしたのはコンテスト開始から2分後です。
B問題
問題の概要
文字列が与えられます。
の奇数番目の文字がすべて英小文字かつ、偶数番目の文字が全て英大文字であるか判定してください。
制約
- の長さは1以上1000以下
- は英大文字及び英小文字のみからなる
どのように考えたか
for文で大文字か小文字かをチェックした
結果
1発AC
提出したコード
#include<bits/stdc++.h> #include<atcoder/all> #define rep(i, n) for (long long i = 0; i < (long long)(n); i++) #define REP(i,v,n) for(long long i = v; i <= (long long)(n); i++) #define rrep(i,n) for(long long i = n;0 <= (long long)(i); i--) #define RREP(i,n,v) for(long long i = n;v <= (long long)(i); i--) #define all(v) v.begin(), v.end() #define rall(v) v.rbegin(), v.rend() template<class T> inline bool chmax(T& a, T b) { if (a < b) { a = b; return 1; } return 0; } template<class T> inline bool chmin(T& a, T b) { if (a > b) { a = b; return 1; } return 0; } using namespace std; using namespace atcoder; using ll = long long; using pi = pair<int, int>; ll pows(ll x, ll n) {ll ret = 1;while (n > 0) {if (n & 1) ret *= x;x *= x;n >>= 1;}return ret;} int main() { string s; cin >> s; bool ans = true; rep(i,s.size()){ char c = s[i]; if(i%2==0){//小文字だとOK if(c < 'a' || 'z' <c)ans = false; } else { if(c < 'A' || 'Z' <c)ans = false; } } //Yes/Noを返す if (ans) cout << "Yes" << endl; else cout << "No" << endl; return 0; }
偶数、奇数の扱いで1WA出さなくてよかった
ACまでの時間
ACしたのはコンテスト開始から4分後です。
C問題
問題の概要
以上の整数に対して、を次のように定めます。
- を十進法で表した時の各桁の数字を大きい順に並び変えてできる整数
- を十進法で表した時の各桁の数字を小さい順に並び変えてできる整数
整数が与えられるので、で定まる数列のを求めてください
制約
- 入力は全て整数
どのように考えたか
配列を数列と見立てて関数の通りに一つ一つ計算していった
結果
1発AC
・提出したコード
#include<bits/stdc++.h> #include<atcoder/all> #define rep(i, n) for (long long i = 0; i < (long long)(n); i++) #define REP(i,v,n) for(long long i = v; i <= (long long)(n); i++) #define rrep(i,n) for(long long i = n;0 <= (long long)(i); i--) #define RREP(i,n,v) for(long long i = n;v <= (long long)(i); i--) #define all(v) v.begin(), v.end() #define rall(v) v.rbegin(), v.rend() template<class T> inline bool chmax(T& a, T b) { if (a < b) { a = b; return 1; } return 0; } template<class T> inline bool chmin(T& a, T b) { if (a > b) { a = b; return 1; } return 0; } using namespace std; using namespace atcoder; using ll = long long; using pi = pair<int, int>; ll pows(ll x, ll n) {ll ret = 1;while (n > 0) {if (n & 1) ret *= x;x *= x;n >>= 1;}return ret;} int main() { ll n,k; cin >> n >> k; vector<ll>ans(k+1); ans[0] = n; rep(i,k){ string s = to_string(ans[i]); sort(rall(s)); ll mi=0,ma; ma = stoll(s); int len = s.size(),cnt=0; rep(i,len){ mi += ll(s[i] - '0') * pows(10,cnt); cnt++; } ans[i+1] = ma - mi; } cout << ans[k] << endl; return 0; }
を勘違いして逆に書き配列外参照を起こしたりいろいろ散々な結果だった・・・
ACまでの時間
ACしたのはコンテスト開始から32分後です。
結果
コンテスト結果
ABCの3完でした。
C問題でやらかしてしまいました・・・
パフォーマンス、レーティング変動
今回のパフォーマンスは611、前回より200近く下がってしまいました。
レーティングはそれに伴い-10の701となりました。
反省点
今回は問題文をよく読まず間違った実装をしてしまったことで、C問題が難しいと勘違いしてしまいました。
落ち着いて問題に取り組みたいです。