ABC189に参加しました
AtCoderのコンテストに参加した際の結果と考え方、反省点などを書いていきます。
コンテストページはこちら
解いた/挑んだ問題
A問題
問題の概要
3文字の文字列が与えられます。
文字列中の文字が全て等しいか判断してください。
制約
- は英大文字のみで構成される
どのように考えたか
Sの一文字目と2文字目、3文字目が同じか判断した。
結果
一発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; char c = s.front(); for(auto t:s)if(c != t)ans = false; cout << ((ans)?"Won":"Lost") << endl; return 0; }
A問題って感じでした。
ACまでの時間
ACしたのはコンテスト開始から2分後です。
B問題
問題の概要
高橋君はお酒を杯飲みました。
i番目に飲んだお酒は量がで、アルコール度数がです。
高橋君はアルコール摂取量がを超えると酔っぱらいます。
高橋君は何杯目で酔っぱらいますか、もし杯飲んでも酔っぱらわなかった場合、-1を出力して下さい。
制約
- 入力はすべて整数
どのように考えたか
高橋君が酔っ払ってしまうアルコールの量を100倍して、
アルコール度数を1/100せずにかけて浮動小数点で計算しないことにより
誤差をなくして計算する
後は、forループで何杯目で酔っぱらったか判定する
結果
誤差に気づかず3回目で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 n,ans=-1; int p,x,v,sum=0; cin >> n >> x; x *= 100; rep(i,n){ cin >> v >> p; v *= p; sum += v; if(x < sum){ ans = i+1; break; } } cout << ans << endl; return 0; }
ACまでの時間
ACしたのはコンテスト開始から98分後です。
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,mi; ll ans = 0; cin >> n; vector<ll>arr(n); rep(i,n)cin >> arr[i]; rep(i,n){ mi = 10010010; REP(j,i,n-1){ chmin(mi,arr[j]); chmax(ans,mi * (j-i+1)); } } cout << ans << endl; return 0; }
制約が微妙で間に合うか心配だったが間に合ってよかった
ACまでの時間
ACしたのはコンテスト開始から26分後。
結果
コンテスト結果
ABCの3完でした。
Bで誤差の問題が出て見事はまってしまいました・・・
パフォーマンス、レーティング変動
今回のパフォーマンスは731、前回よりも250近く下がってしまいました。
レーティングはそれに伴い+4の701となりました。
反省点
B問題でハマってしまって即座にC問題に移行したのはよかったが、
その後D問題に行ってB問題を振り返らずに時間がたってしまった。
すぐにB問題に戻り誤差に気づいていればもうちょっとパフォが出ていたと考えると勿体なかった部分もあるかと思いました。
久しぶりに誤差問題が出てしまって見事にハマってしまったので、誤差問題かどうかをきちんと見極められるようにしたいです。