imomoの勉強記録

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

ABC192に参加しました

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

解いた/挑んだ問題

A問題

問題の概要

ある数Xが与えられます。
Xより大きい100の倍数との差はいくつありますか?

制約
  • 1 \leq X \leq 10^5
どのように考えたか

答えが1~99なので、for文でXに1ずつ足していきながらXが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() {
	int a,cnt=0;
	cin >>a;
	rep(i,1000){
		a++;
		cnt++;
		if(a%100==0)break;
	}
	cout << cnt << endl;
	return 0;
}

問題の誤読をしなくてよかった

ACまでの時間

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

f:id:iiiimmmmo:20210220233341p:plain
ABC192_A

B問題

問題の概要

文字列Sが与えられます。
Sの奇数番目の文字がすべて英小文字かつ、偶数番目の文字が全て英大文字であるか判定してください。

制約
  • Sの長さは1以上1000以下
  • Sは英大文字及び英小文字のみからなる
どのように考えたか

for文で大文字か小文字かをチェックした

結果

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() {
	string s;
	cin >> s;
	bool ans = true;
	rep(i,s.size()){
		char c = s[i];
		if(i%2==0){//小文字だとOK
			if(c < 'a' || 'z' <c)ans = false;
		}
		else {
			if(c < 'A' || 'Z' <c)ans = false;
		}
	}
	//Yes/Noを返す
	if (ans) cout << "Yes" << endl;
	else cout << "No" << endl;
	return 0;
}

偶数、奇数の扱いで1WA出さなくてよかった

ACまでの時間

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

f:id:iiiimmmmo:20210220233732p:plain
ABC192_B

C問題

問題の概要

0以上の整数xに対して、g_1(x),g_2(x),f(x)を次のように定めます。

  • g_1(x) = xを十進法で表した時の各桁の数字を大きい順に並び変えてできる整数
  • g_2(x) = xを十進法で表した時の各桁の数字を小さい順に並び変えてできる整数
  • f(x) = g_1(x) - g_2(x)

整数N,Kが与えられるので、a_0 = N,a_{i+1} = f(a_i)(0 \leq i)で定まる数列のa_Kを求めてください

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

配列を数列と見立てて関数の通りに一つ一つ計算していった

結果

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,k;
	cin >> n >> k;
	vector<ll>ans(k+1);
	ans[0] = n;
	rep(i,k){
		string s = to_string(ans[i]);
		sort(rall(s));
		ll mi=0,ma;
		ma = stoll(s);
		int len = s.size(),cnt=0;
		rep(i,len){
			mi += ll(s[i] - '0') * pows(10,cnt);
			cnt++;
		}
		ans[i+1] = ma - mi;
	}
	cout << ans[k] << endl;
	return 0;
}

n,kを勘違いして逆に書き配列外参照を起こしたりいろいろ散々な結果だった・・・

ACまでの時間

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

f:id:iiiimmmmo:20210220234811p:plain
ABC192_C

結果

コンテスト結果

ABCの3完でした。
C問題でやらかしてしまいました・・・

f:id:iiiimmmmo:20210220234857p:plain
ABC192

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

今回のパフォーマンスは611、前回より200近く下がってしまいました。
レーティングはそれに伴い-10の701となりました。

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

反省点

今回は問題文をよく読まず間違った実装をしてしまったことで、C問題が難しいと勘違いしてしまいました。
落ち着いて問題に取り組みたいです。