imomoの勉強記録

主に勉強の記録などを残していきます

ABC165に参加しました

AtCoderのコンテストに参加した際の結果と考え方、反省点などを書いていきます。
コンテストページはこちら

解いた/挑んだ問題

A問題

問題の概要

A,B,Kが与えられる
Kの倍数がA以上B以下であれば"OK"を当てはまらない場合は"NG"を出力せよ。

制約

(1 \leq A \leq B \leq 1000)
(1 \leq K \leq 1000)

どのように考えたか

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分後です。

f:id:iiiimmmmo:20200503002140p:plain
ABC165_A

B問題

問題の概要

一年で1%の利子がつく銀行に何年預けたらX円を超えるか

制約

(1 \leq X \leq 10^{18})

どのように考えたか

ループの中で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分後です。

f:id:iiiimmmmo:20200503002158p:plain
ABC165_B

C問題

問題の概要

この問題は、問題文を映してから実際の値を代入して説明する形とします。

N,M,Qと4つの整数の組(a_i,b_i,c_i,d_i)が与えられます。
以下の条件を満たす数列Aを考えます。

  • Aは長さNの正整数列である。
  •  1 \leq A_1 \leq A_2 \leq ・・・ \leq A_N \leq M

この数列の得点は、A_{b_i} - A_{a_i} = c_iを満たすようなiについての、d_iの総和です(そのようなiが存在しないは0)

Aの最大値を求めよ


要約すると、すると、数列の長さはNで、数列には、1~Mまでの数が入ります。
数列は、A_i \leq A_{i + 1}とする必要があります。
与えられた整数の組のi番目のbは、数列Aの番号を示しており、その他も同様です。
整数の組 1 2 3 4が与えられ 数列がA = {2,5,3,7,6}、i = 1としましょう

b_iは1番目のbの値なので2で、A_{b_i}は、Aの2番目となり、5です。
a_iは1番目のaの値なので1で、A_{a_i}は、Aの1番目となり、2です。
c_iも同様にすると、3と分かります。
つまり、 A_{b_i} - A_{a_i} = c_iは、5-2 = 3となります。
この式が成り立つ場合に、d_iの4がAの数列の得点に加算されます。

制約
  • 入力はすべて整数
  •  2 \leq N \leq 10
  •  1 \leq M \leq 10
  •  1 \leq Q \leq 50
  •  1 \leq a_i \leq b_i \leq N(i = 1,2....Q)
  •  0 \leq c_i \leq M - 1 (i = 1,2....Q)
  •  (a_i,b_i,c_i) ≠ (a_j,b_j,c_j) (i ≠ jのとき)
  •  1 \leq d_i \leq 10^5 (i = 1,2....Q)
どのように考えたか

10重ループで可能性のある数列を全列挙して出す。

結果

提出せずに終わりました。
提出したコード
なし
問題の意味に気づくのに時間がかかり、D問題を解いていたため、解けなかったです。

ACまでの時間

なし

D問題

問題の概要

floor(t)を実数t以下の最大の整数を返す
整数A,B,Nが与えられる
N以下の非負整数xに対する floor(Ax/B) - A × floor(x/B)の最大値を求めよ

制約
  •  1 \leq A \leq 10^6
  •  1 \leq B \leq 10^{12}
  •  1 \leq N \leq 10^{12}
  • 入力はすべて整数
どのように考えたか

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より通している人が多かったりして全体的に問題が難しいと感じました。

f:id:iiiimmmmo:20200503002233p:plain
ABC165

順位、パフォーマンス変動

順位は前回より3000位近く下がり7441位、レーティングは2だけ上がりましたが、実質意味はないと思っています。

f:id:iiiimmmmo:20200503002249p:plain
コンテスト成績表
f:id:iiiimmmmo:20200503002328p:plain

反省点

今回はA問題を解くのに時間がかかり、その後もC問題の問題の意図を読み取れなかったりと反省が多いコンテストとなりました。
問題の考察などをしっかりしてせめて3完は安定してとっていけるようになりたいです。