imomoの勉強記録

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

エイシング プログラミング コンテスト 2020に参加しました

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

解いた/挑んだ問題

A問題

問題の概要

L以上R以下の整数のうち、dの倍数はいくつあるか

制約
  • 入力はすべて整数
  • 1 \leq L \leq R \leq 100
  • 1 \leq d \leq 100
どのように考えたか

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

f:id:iiiimmmmo:20200711225643p:plain
aising_A

B問題

問題の概要

1,2,3,...Nの番号が付いたマスには、整数が書かれている
マスの番号が奇数かつ、マスの整数が奇数であるマスの個数を答えよ

制約
  • 入力はすべて整数
  • 1 \leq N,a_i \leq 100
どのように考えたか

マスを受け取るときに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分後です。

f:id:iiiimmmmo:20200711225704p:plain
aising_B

C問題

問題の概要

f(n)を以下の二つの条件を満たすような3つの整数の組(x,y,z)とする。

  • 1 \leq x,y,x
  • x^2 + y^2 + z^2 + xy + yz + zx = n

整数Nが与えられるのでf(1),f(2),f(3),...f(N)までを一行毎に出力せよ

制約
  • 入力はすべて整数
  • 1 \leq N \leq 10^4
どのように考えたか

制約が10^4かつ、条件の二つ目にx^2のように整数を2乗する式が入っているため、整数の組の最大値は100以下になる(10^2 × 2 = 10^4のため)
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分後。

f:id:iiiimmmmo:20200711225721p:plain
aising_C

結果

コンテスト結果

ABCの3完でした。
C問題で考察力が足りず解くのに時間がかかってしまった

f:id:iiiimmmmo:20200711225736p:plain
aising

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

今回のパフォーマンスは722、前回より100近く上がりました。
レーティングはそれに伴い+22の549となりました。

f:id:iiiimmmmo:20200711231027p:plain
コンテスト成績表
f:id:iiiimmmmo:20200711231139p:plain
エイシング プログラミング コンテスト 2020終了時点でのレーティング

反省点

気付けば簡単な実装で解くことができる問題を気づくことができず順位を落としている気がしているので、
この問題はこの実装でとすぐ気づけるようになりたいです。