ABC165に参加しました
AtCoderのコンテストに参加した際の結果と考え方、反省点などを書いていきます。
コンテストページはこちら
解いた/挑んだ問題
A問題
問題の概要
A,B,Kが与えられる
Kの倍数がA以上B以下であれば"OK"を当てはまらない場合は"NG"を出力せよ。
制約
どのように考えたか
kを足していって比較を行いAを超えたらOKかNGかの判定を行った。
結果
一発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 ll = long long; template <typename T> bool chmax(T & a, const T & b) { if (a < b) { a = b; // aをbで更新 return true; } return false; } template <typename T> bool chmin(T & a, const T & b) { if (a > b) { a = b; // aをbで更新 return true; } return false; } using namespace std; int main(){ int K, A, B; int sum = 0; cin >> K >> A >> B; int mk = A / K; for (int i = 0; i <= 1000; i++) { sum += K; if (A <= sum) { if (A <= sum && sum <= B) { cout << "OK" << endl; break; } else { cout << "NG" << endl; break; } } } return 0;
最初kのn乗をとったりいろいろおかしいコードを書いてしまったので提出が遅れてしまった
ACまでの時間
ACしたのはコンテスト開始から12分後です。
B問題
問題の概要
一年で1%の利子がつく銀行に何年預けたらX円を超えるか
制約
どのように考えたか
ループの中でxに1.01をかけ続け、カウントをとる
X以上になったら抜ける
結果
一発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 ll = long long; template <typename T> bool chmax(T & a, const T & b) { if (a < b) { a = b; // aをbで更新 return true; } return false; } template <typename T> bool chmin(T & a, const T & b) { if (a > b) { a = b; // aをbで更新 return true; } return false; } using namespace std; int main(){ ll K = 100; ll X; ll cnt = 0; cin >> X; while (1) { cnt++; K *= 1.01; if (K >= X)break; } cout << cnt << endl; return 0; } }
A問題より落ち着いてきたので冷静にコードを書けたと思う
ACまでの時間
ACしたのはコンテスト開始から15分後です。
C問題
問題の概要
この問題は、問題文を映してから実際の値を代入して説明する形とします。
N,M,Qと4つの整数の組が与えられます。
以下の条件を満たす数列Aを考えます。
- Aは長さNの正整数列である。
この数列の得点は、を満たすようなiについての、の総和です(そのようなiが存在しないは0)
Aの最大値を求めよ
要約すると、すると、数列の長さはNで、数列には、1~Mまでの数が入ります。
数列は、とする必要があります。
与えられた整数の組のi番目のbは、数列Aの番号を示しており、その他も同様です。
整数の組 1 2 3 4が与えられ 数列がA = {2,5,3,7,6}、i = 1としましょう
は1番目のbの値なので2で、は、Aの2番目となり、5です。
は1番目のaの値なので1で、は、Aの1番目となり、2です。
も同様にすると、3と分かります。
つまり、 は、5-2 = 3となります。
この式が成り立つ場合に、の4がAの数列の得点に加算されます。
制約
- 入力はすべて整数
どのように考えたか
10重ループで可能性のある数列を全列挙して出す。
結果
提出せずに終わりました。
・提出したコード
なし
問題の意味に気づくのに時間がかかり、D問題を解いていたため、解けなかったです。
ACまでの時間
なし
D問題
問題の概要
を実数t以下の最大の整数を返す
整数A,B,Nが与えられる
N以下の非負整数に対する の最大値を求めよ
制約
- 入力はすべて整数
どのように考えたか
0からNまで繰り返しして、問題通りの式を計算して提出
結果
WAでした
・提出したコード
#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 ll = long long; template <typename T> bool chmax(T & a, const T & b) { if (a < b) { a = b; // aをbで更新 return true; } return false; } template <typename T> bool chmin(T & a, const T & b) { if (a > b) { a = b; // aをbで更新 return true; } return false; } using namespace std; int main(){ ll mmax = -1; ll A, B, N; cin >> A >> B >> N; vector<ll>c; REP(i, N) { c.push_back(ll(floor((A * i) / B) - A * floor(i / B))); mmax = max(mmax, c[i - 1]); } cout << mmax << endl; return 0; }
なんで通らないのかずっと不思議でした。
ACまでの時間
なし
結果
コンテスト結果
ABの2完でした。
今回は普段のABCとは違いDの方がCより通している人が多かったりして全体的に問題が難しいと感じました。
順位、パフォーマンス変動
順位は前回より3000位近く下がり7441位、レーティングは2だけ上がりましたが、実質意味はないと思っています。
反省点
今回はA問題を解くのに時間がかかり、その後もC問題の問題の意図を読み取れなかったりと反省が多いコンテストとなりました。
問題の考察などをしっかりしてせめて3完は安定してとっていけるようになりたいです。