imomoの勉強記録

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

ABC183に参加しました

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

解いた/挑んだ問題

A問題

問題の概要

xが与えられる
xが0以上の場合xを、0未満の場合0を出力せよ

制約
  • xは整数
  • -10 \leq N \leq 10
どのように考えたか

if文で場合分けして出力した

結果

一発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, n) for (long long i = 1; i <= (long long)(n); i++)
#define FOR(i,x,n,r) for(long long i = x; i< (long long)(n); i+=r)
#define afor(a,t) for(auto a:t)
#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;
	cin >> n;
	if(n < 0)cout << 0 << endl;
	else cout << n << endl;
	return 0;
}

最初少し困惑したが素早く解けて良かった

ACまでの時間

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

f:id:iiiimmmmo:20201115225840p:plain
ABC183_A

B問題

問題の概要

二次元平面上のビリヤード台で、点A(x_1,y_1)から、一度壁を反射させたのち点B(x_2,y_2)を通過させるように玉を打ちたい。
x軸のどこを狙えばよいか

制約
  • -10^6 \leq S_x,G_x \leq 10^6
  • 0 < S_y,G_y \leq 10^6
  • S_x ≠ G_x
  • 入力はすべて整数
どのように考えたか

二つの三角形と見立てて、点Aと点Bのy軸の値から比例式を用いて底辺の使用率(?)を算出した

結果

一発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, n) for (long long i = 1; i <= (long long)(n); i++)
#define FOR(i,x,n,r) for(long long i = x; i< (long long)(n); i+=r)
#define afor(a,t) for(auto a:t)
#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,c,d;
	cin >> a >> b >> c >>d;
	double h = d/b;
	double l = c - a;
	double r = a + ((1/(1+h))*l);
	//小数点以下の精度を求められる時
	cout << fixed << setprecision(12) << r << endl;
	return 0;
}

こういう問題はとてもすっごくかなり苦手なので慣れていきたいです

ACまでの時間

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

f:id:iiiimmmmo:20201115225855p:plain
ABC183_B

C問題

問題の概要

N個の都市があり、都市iから都市jへ移動するにはT_{i,j}時間がかかります。
都市1を出発し、すべての都市を訪問してから都市1に戻る経路のうち
移動の合計時間がちょうどkとなるものはいくつあるか

制約
  • 2 \leq N \leq 8
  • i ≠ jのとき、1 \leq T_{i,j} \leq 10^8
  • T_{i,j} = 0
  • T_{i,j} = T_{j,i}
  • 1 \leq K \leq 10^9
  • 入力はすべて整数
どのように考えたか

2~nまで順列全探索を行い、
各径路間を配列参照して加算、kと等しかったらカウント

結果

一発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, n) for (long long i = 1; i <= (long long)(n); i++)
#define FOR(i,x,n,r) for(long long i = x; i< (long long)(n); i+=r)
#define afor(a,t) for(auto a:t)
#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,k;
	ll tmp=0,ans=0,sum=0;
	cin >> n >> k;
	vector<vector<ll>>v(n,vector<ll>(n));
	rep(i,n)rep(j,n)cin >> v[i][j];
	vector<int>vv(n-1);
	iota(all(vv),1);
	do{
		tmp = v[0][vv[0]];
		FOR(i,0,n-2,1)tmp += v[vv[i]][vv[i+1]];
		tmp += v[vv[n-2]][0];
		if(tmp == k)ans++;
	}while(next_permutation(all(vv)));
	cout << ans <<endl;
	return 0;
}

cの方がbより簡単でした。。。

ACまでの時間

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

f:id:iiiimmmmo:20201115225921p:plain
ABC183_C

結果

コンテスト結果

ABCの3完でした。
B問題でとっっっても詰まりました。
こういう苦手をなくしていきたいです。

f:id:iiiimmmmo:20201115225935p:plain
ABC183

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

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

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

反省点

今回は、B問題が分からず、勘で書いたら通ったのですが、普通に解けるようにしたいなと思いました。
D問題を解かないとレートは伸びないので、日々の精進を忘れないようにしたいです。