imomoの勉強記録

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

ABC189に参加しました

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

解いた/挑んだ問題

A問題

問題の概要

3文字の文字列Sが与えられます。
文字列中の文字が全て等しいか判断してください。

制約
  • Sは英大文字のみで構成される
どのように考えたか

Sの一文字目と2文字目、3文字目が同じか判断した。

結果

一発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;
	char c = s.front();
	for(auto t:s)if(c != t)ans = false;
	cout << ((ans)?"Won":"Lost") << endl;
	return 0;
}
f:id:iiiimmmmo:20210124000146p:plain
ABC189_A

A問題って感じでした。

ACまでの時間

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


B問題

問題の概要

高橋君はお酒をN杯飲みました。
i番目に飲んだお酒は量がV_imlで、アルコール度数がP_i%です。
高橋君はアルコール摂取量がXmlを超えると酔っぱらいます。
高橋君は何杯目で酔っぱらいますか、もしN杯飲んでも酔っぱらわなかった場合、-1を出力して下さい。

制約
  • 1 \leq N \leq 10^3
  • 0 \leq X \leq 10^6
  • 1 \leq V_i \leq 10^3
  • 0 \leq P_i \leq 100
  • 入力はすべて整数
どのように考えたか

高橋君が酔っ払ってしまうアルコールの量を100倍して、
アルコール度数を1/100せずにかけて浮動小数点で計算しないことにより
誤差をなくして計算する
後は、forループで何杯目で酔っぱらったか判定する

結果

誤差に気づかず3回目で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 n,ans=-1;
	int p,x,v,sum=0;
	cin >> n >> x;
	x *= 100;
	rep(i,n){
		cin >> v >> p;
		v *= p;
		sum += v;
		if(x < sum){
			ans = i+1;
			break;
		}
	}
	cout << ans << endl;
	return 0;
}
ACまでの時間

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

f:id:iiiimmmmo:20210124001512p:plain
ABC189_B

C問題

問題の概要

N枚の皿が一列に並んでおり、左からi番目の皿にはA_i個のミカンが置いてあります。
区間[l,r]、及びⅹを決め、l番目の皿からr番目の皿まで、x個ミカンをとることとします。
この時、皿の上にあるミカンの個数より大きいxを設定することはできません。
適切に区間xを決めたとき最大でミカンはいくつ取れますか

制約
  • 1 \leq N \leq 10^4
  • 1 \leq A_i \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,mi;
	ll ans = 0;
	cin >> n;
	vector<ll>arr(n);
	rep(i,n)cin >> arr[i];
	rep(i,n){
		mi = 10010010;
		REP(j,i,n-1){
			chmin(mi,arr[j]);
			chmax(ans,mi * (j-i+1));
		}
	}
	cout << ans << endl;
	return 0;
}

制約が微妙で間に合うか心配だったが間に合ってよかった

ACまでの時間

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

f:id:iiiimmmmo:20210124005000p:plain
ABC189_C

結果

コンテスト結果

ABCの3完でした。
Bで誤差の問題が出て見事はまってしまいました・・・

f:id:iiiimmmmo:20210124005101p:plain
ABC189

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

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

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

反省点

B問題でハマってしまって即座にC問題に移行したのはよかったが、
その後D問題に行ってB問題を振り返らずに時間がたってしまった。
すぐにB問題に戻り誤差に気づいていればもうちょっとパフォが出ていたと考えると勿体なかった部分もあるかと思いました。
久しぶりに誤差問題が出てしまって見事にハマってしまったので、誤差問題かどうかをきちんと見極められるようにしたいです。