M-SOLUTIONS プロコンオープン 2020に参加しました
AtCoderのコンテストに参加した際の結果と考え方、反省点などを書いていきます。
コンテストページはこちら
解いた/挑んだ問題
A問題
問題の概要
M君のレーティングXが与えられる
AtCoderでレーティングに応じて与えている級位を出力せよ
制約
- Xは整数
どのように考えたか
問題文に明記してあるレーティングをそのままif文を用いて条件分岐
結果
一発AC
・提出ししたコード
#include"bits/stdc++.h" #define rep(i, n) for (int i = 0; i < (int)(n); i++) #define REP(i, n) for (int i = 1; i <= (int)(n); i++) #define all(v) v.begin(), v.end() using namespace std; using ll = long long; using pi = pair<int, int>; const ll INF = 1LL << 60; int main() { int x; int res = 0; cin >> x; if (400 <= x && x <= 599)res = 8; else if (600 <= x && x <= 799)res = 7; else if (800 <= x && x <= 999)res = 6; else if (1000 <= x && x <= 1199)res = 5; else if (1200 <= x && x <= 1399)res = 4; else if (1400 <= x && x <= 1599)res = 3; else if (1600 <= x && x <= 1799)res = 2; else if (1800 <= x && x <= 1999)res = 1; cout << res << endl; }
入力ミスとの闘う問題だなと思った
ACまでの時間
ACしたのはコンテスト開始から4分後です。
B問題
問題の概要
整数A,B,Cが書かれた赤、緑、青のカードがある
K回までカードいずれか一枚の数を2倍できる
カードに書かれている数字を青>緑>赤にすることができるか
制約
- 入力はすべて整数
どのように考えたか
for文でK回回し、緑が赤より小さければ緑を二倍、青が緑より小さければ青を二倍する
for文の中、もしくはK回回した後に問題文の条件と一致するかどうか判定する
結果
一発AC
提出したコード
#include"bits/stdc++.h" #define rep(i, n) for (int i = 0; i < (int)(n); i++) #define REP(i, n) for (int i = 1; i <= (int)(n); i++) #define all(v) v.begin(), v.end() using namespace std; using ll = long long; using pi = pair<int, int>; const ll INF = 1LL << 60; int main() { int a, b, c, k; bool ans = false; cin >> a >> b >> c >> k; rep(i, k) { if (c > b && b > a) { ans = true; break; } if (a >= b)b *= 2; else if (b >= c)c *= 2; } if (c > b && b > a) { ans = true; } if (ans) { cout << "Yes" << endl; } else { cout << "No" << endl; } }
Kの範囲が小さかったため安心してかけた
ACまでの時間
ACしたのはコンテスト開始から10分後です。
C問題
問題の概要
N学期制を用いる学校がある
学期末にテストがあり、その得点はである
1からK-1学期までは評点がつかず、KからN学期まで評点が行われる
i学期の評点はその学期を含めた直近K回のテストの掛け算で算出される
K+1からN学期までで、i学期の評点がi-1学期より高い場合'Yes'、i-1学期以下の場合'No'を一行毎に出力せよ
制約
- 入力はすべて整数
どのように考えたか
i学期とi-1学期の評点算出におけるk-1学期は同じ評点なので、違う評点同士を比較してあげる
結果
一発AC
・提出したコード
#include"bits/stdc++.h" #define rep(i, n) for (int i = 0; i < (int)(n); i++) #define REP(i, n) for (int i = 1; i <= (int)(n); i++) #define all(v) v.begin(), v.end() using namespace std; using ll = long long; using pi = pair<int, int>; const ll INF = 1LL << 60; int main() { int n, k; bool ans = false; cin >> n >> k; vector<int>a(n); rep(i,n)cin >> a[i]; rep(i, n - k) { if (a[i] < a[i + k])ans = true; else ans = false; if (ans) { cout << "Yes" << endl; } else { cout << "No" << endl; } } }
の制約がだったため、何かあるなと思って探したら早く見つけられてよかった
ACまでの時間
ACしたのはコンテスト開始から18分後。
結果
コンテスト結果
ABCの3完でした。
C問題まで早く解けたのでD問題に挑みましたが、方針もたたず3完に終わってしまいました
パフォーマンス、レーティング変動
今回のパフォーマンスは598、前回より100近くも下がってしまいました。
レーティングはそれに伴い+5の554となりました。
反省点
十分に問題を解く時間が余っていても、問題を解く方針が立たず、解けないこともあるので
問題を言い換える力を身に着けていきたいです。