imomoの勉強記録

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

キャディプログラミングコンテスト2021(ABC193)に参加しました

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

解いた/挑んだ問題

A問題

問題の概要

定価A円の商品がB円で売られているとき、この商品の売値は定価の何パーセント引きですか?

制約
  • 1 \leq B < A \leq 10^5
  • A,Bは整数
どのように考えたか

BAの何パーセントかを求め、100から引いた

結果

1発AC
・提出したコード

#include<bits/stdc++.h>
#include<atcoder/all>

#define rep(i, n) for (long long i = 0; i < (long long)(n); i++)
#define REP(i,v,n) for(long long i = v; i <= (long long)(n); i++)
#define rrep(i,n) for(long long i = n;0 <= (long long)(i); i--)
#define RREP(i,n,v) for(long long i = n;v <= (long long)(i); i--)
#define all(v) v.begin(), v.end()
#define rall(v) v.rbegin(), v.rend()
template<class T> inline bool chmax(T& a, T b) { if (a < b) { a = b; return 1; } return 0; }
template<class T> inline bool chmin(T& a, T b) { if (a > b) { a = b; return 1; } return 0; }
using namespace std;
using namespace atcoder;
using ll = long long;
using pi = pair<int, int>;
ll pows(ll x, ll n) {ll ret = 1;while (n > 0) {if (n & 1) ret *= x;x *= x;n >>= 1;}return ret;}

int main() {
	double a,b;
	cin >>a >> b;
	//小数点以下の精度を求められる時
	cout << fixed << setprecision(12);
	cout << 100.0 - (b/a  *100 )<< endl;
	return 0;
}

最初、定価の何パーセントですか に見えたので答えが合わなくて焦った

ACまでの時間

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

f:id:iiiimmmmo:20210227234627p:plain
ABC193_A

B問題

問題の概要

高橋君はゲーム機が欲しいです。
ゲーム機は店1,2,3,...,NN軒あり、店iは高橋君の現在地から徒歩でA_1分、ゲーム機の販売価格はP_i円、現在の在庫はP_i個です
ゲーム機は人気なので、今から0.5,1.5,2.5,...分後に1台売れます。
高橋君はゲーム機を買うことができますか?できる場合は買うのに必要な最小金額を求めてください。

制約
  • 1 \leq N \leq 10^5
  • 1 \leq A_i,P_i,X_i \leq 10^9
  • 入力は全て整数
どのように考えたか

1分経過すれば1個、2分経過すれば2個のように、n分経過すればn個売れるので、高橋君が各店に行くまでにかかる時間分、店の在庫から引く。
そのあと、すべての店に対して、在庫が1以上なら、購入し最小金額を求める。

結果

1発AC
提出したコード

#include<bits/stdc++.h>
#include<atcoder/all>

#define rep(i, n) for (long long i = 0; i < (long long)(n); i++)
#define REP(i,v,n) for(long long i = v; i <= (long long)(n); i++)
#define rrep(i,n) for(long long i = n;0 <= (long long)(i); i--)
#define RREP(i,n,v) for(long long i = n;v <= (long long)(i); i--)
#define all(v) v.begin(), v.end()
#define rall(v) v.rbegin(), v.rend()
template<class T> inline bool chmax(T& a, T b) { if (a < b) { a = b; return 1; } return 0; }
template<class T> inline bool chmin(T& a, T b) { if (a > b) { a = b; return 1; } return 0; }
using namespace std;
using namespace atcoder;
using ll = long long;
using pi = pair<int, int>;
ll pows(ll x, ll n) {ll ret = 1;while (n > 0) {if (n & 1) ret *= x;x *= x;n >>= 1;}return ret;}

int main() {
	ll n,ans = 1001001001;
	cin >> n;
	vector<ll>a(n),p(n),x(n);
	rep(i,n)cin >> a[i] >> p[i] >> x[i];
	rep(i,n){
		x[i] -= a[i];
		if(0 < x[i])chmin(ans,p[i]);
	}
	if(ans == 1001001001)ans = -1;
	cout << ans << endl;
	return 0;
}

落ち着いて考えれば簡単だった

ACまでの時間

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

f:id:iiiimmmmo:20210227235738p:plain
ABC193_B

C問題

問題の概要

整数Nが与えられます。1以上N以下の整数のうち、2以上の整数a,bを用いてa^bと表せないものはいくつあるでしょうか

制約
  • Nは整数
  • 1 \leq N \leq 10^{10}
どのように考えたか

指数に最低でも2を用いる必要があるので、Nを超えないよう2^2から、\lfloor \sqrt{N} \rfloor ^2まで探索する
2^{33} < 10^{10} < 2^{34}なので十分計算量は小さいことがわかる

結果

1発AC
提出したコード

#include<bits/stdc++.h>
#include<atcoder/all>

#define rep(i, n) for (long long i = 0; i < (long long)(n); i++)
#define REP(i,v,n) for(long long i = v; i <= (long long)(n); i++)
#define rrep(i,n) for(long long i = n;0 <= (long long)(i); i--)
#define RREP(i,n,v) for(long long i = n;v <= (long long)(i); i--)
#define all(v) v.begin(), v.end()
#define rall(v) v.rbegin(), v.rend()
template<class T> inline bool chmax(T& a, T b) { if (a < b) { a = b; return 1; } return 0; }
template<class T> inline bool chmin(T& a, T b) { if (a > b) { a = b; return 1; } return 0; }
using namespace std;
using namespace atcoder;
using ll = long long;
using pi = pair<int, int>;
ll pows(ll x, ll n) {ll ret = 1;while (n > 0) {if (n & 1) ret *= x;x *= x;n >>= 1;}return ret;}

int main() {
	ll N,n;
	set<ll>se;
	cin >> N;
	if(N < 4){
		cout << N << endl;
		return 0;
	}else{
		n = floor(sqrt(N));
		REP(i,2,n){
			ll tmp = i;
			while(tmp < N){
				tmp *= i;
				if(tmp <= N)se.insert(tmp);
			}
		}
	}
	cout << N - se.size() << endl;
	return 0;
}

オーバーフローしないのにオーバーフローすると勘違いして時間を溶かしました・・・

ACまでの時間

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

f:id:iiiimmmmo:20210228000834p:plain
ABC193_C

結果

コンテスト結果

ABCの3完でした。
C問題で無限に時間を使ってしまいました

f:id:iiiimmmmo:20210228001024p:plain
ABC193

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

今回のパフォーマンスは561、前回より50も下がってしまいました。
レーティングはそれに伴い-13の688となりました。

f:id:iiiimmmmo:20210228001125p:plain
コンテスト成績表
f:id:iiiimmmmo:20210228001143p:plain
ABC193を終えた時点でのレーティング

反省点

今回はC問題で勘違いやミスを連発し、D問題を解ききることができませんでした(D問題はコンテスト終了後4分後に通りました)
ここ最近結果が芳しくなく、挽回してやろうという気持ちから焦りが生まれこのような結果につながったんだと考えています。
自分の本来の実力を出せるように今後鍛えていきたいです。