エイシング プログラミング コンテスト 2020に参加しました
AtCoderのコンテストに参加した際の結果と考え方、反省点などを書いていきます。
コンテストページはこちら
解いた/挑んだ問題
A問題
問題の概要
L以上R以下の整数のうち、dの倍数はいくつあるか
制約
- 入力はすべて整数
どのように考えたか
for文で初期値をL、継続条件をR以下にして、for文で回す値iをdで余りを求めて倍数判定した
結果
一発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, d, cnt = 0; cin >>a>>b >> d; for (int i = a; i <= b; i++) { if (i % d == 0)cnt++; } cout << cnt << endl; }
単純なfor文での処理だと感じた
ACまでの時間
ACしたのはコンテスト開始から2分後です。
B問題
問題の概要
1,2,3,...Nの番号が付いたマスには、整数が書かれている
マスの番号が奇数かつ、マスの整数が奇数であるマスの個数を答えよ
制約
- 入力はすべて整数
どのように考えたか
マスを受け取るときにiが0からindex-1のfor文で回し、iが偶数かつ、受け取った整数が奇数のときを数え出力
結果
一発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, a, cnt = 0; cin >> n; rep(i, n) { cin >> a; if (i % 2 == 0)if (a % 2 == 1)cnt++; } cout << cnt << endl; }
どちらも分かりやすい条件だったのでスムーズに解くことができた
ACまでの時間
ACしたのはコンテスト開始から4分後です。
C問題
問題の概要
整数Nが与えられるのでまでを一行毎に出力せよ
制約
- 入力はすべて整数
どのように考えたか
制約がかつ、条件の二つ目にのように整数を2乗する式が入っているため、整数の組の最大値は100以下になる
1-100の値を入れたvectorを3つ用意し、三重のfor文の中で全列挙し、条件の二つ目を計算したものをmapのkeyにしてインクリメント
最後に1-Nまでmapのvalueを出力
結果
2回目で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() { vector<int>a(100), b, c; int n; cin >> n; int sum; map<int, int>mp; iota(all(a), 1); b = c = a; for (auto aa : a)for (auto bb : b)for (auto cc : c) { sum = aa * aa + bb * bb + cc * cc + aa * bb + aa * cc + bb * cc; if (sum > 10000)break; mp[sum]++; } for (int i = 1; i <= n; i++) { cout << mp[i] << endl; } //for (auto m : mp)cout << m.first << ":" << m.second << endl; }
普通の三重ループでいいことに気づくのに時間がかかりました・・・
ACまでの時間
ACしたのはコンテスト開始から36分後。
結果
コンテスト結果
ABCの3完でした。
C問題で考察力が足りず解くのに時間がかかってしまった
パフォーマンス、レーティング変動
今回のパフォーマンスは722、前回より100近く上がりました。
レーティングはそれに伴い+22の549となりました。
反省点
気付けば簡単な実装で解くことができる問題を気づくことができず順位を落としている気がしているので、
この問題はこの実装でとすぐ気づけるようになりたいです。