imomoの勉強記録

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

M-SOLUTIONS プロコンオープン 2020に参加しました

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

解いた/挑んだ問題

A問題

問題の概要

M君のレーティングXが与えられる
AtCoderでレーティングに応じて与えている級位を出力せよ

制約
  • 400 \leq X \leq 1999
  • 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分後です。

f:id:iiiimmmmo:20200725223607p:plain
m-solutions_A

B問題

問題の概要

整数A,B,Cが書かれた赤、緑、青のカードがある
K回までカードいずれか一枚の数を2倍できる
カードに書かれている数字を青>緑>赤にすることができるか

制約
  • 1 \leq A,B,C \leq 7
  • 1 \leq K \leq 7
  • 入力はすべて整数
どのように考えたか

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

f:id:iiiimmmmo:20200725223526p:plain
m-solutions_B

C問題

問題の概要

N学期制を用いる学校がある
学期末にテストがあり、その得点はA_iである
1からK-1学期までは評点がつかず、KからN学期まで評点が行われる

i学期の評点はその学期を含めた直近K回のテストの掛け算で算出される
K+1からN学期までで、i学期の評点がi-1学期より高い場合'Yes'、i-1学期以下の場合'No'を一行毎に出力せよ

制約
  • 2 \leq N \leq 200000
  • 1 \leq K \leq N - 1
  • 1 \leq A_i \leq 10^9
  • 入力はすべて整数
どのように考えたか

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;
		}
	}
}

A_iの制約が10^9だったため、何かあるなと思って探したら早く見つけられてよかった

ACまでの時間

ACしたのはコンテスト開始から18分後。

f:id:iiiimmmmo:20200725223557p:plain
m-solutions_C

結果

コンテスト結果

ABCの3完でした。
C問題まで早く解けたのでD問題に挑みましたが、方針もたたず3完に終わってしまいました

f:id:iiiimmmmo:20200725223543p:plain
m-solutions

パフォーマンス、レーティング変動

今回のパフォーマンスは598、前回より100近くも下がってしまいました。
レーティングはそれに伴い+5の554となりました。

f:id:iiiimmmmo:20200725231414p:plain
コンテスト成績表
f:id:iiiimmmmo:20200725231453p:plain
m-solutionsを終えた時点でのレーティング

反省点

十分に問題を解く時間が余っていても、問題を解く方針が立たず、解けないこともあるので
問題を言い換える力を身に着けていきたいです。