ABC183に参加しました
AtCoderのコンテストに参加した際の結果と考え方、反省点などを書いていきます。
コンテストページはこちら
解いた/挑んだ問題
A問題
問題の概要
xが与えられる
xが0以上の場合xを、0未満の場合0を出力せよ
制約
- xは整数
どのように考えたか
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分後です。
B問題
問題の概要
二次元平面上のビリヤード台で、点Aから、一度壁を反射させたのち点Bを通過させるように玉を打ちたい。
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分後です。
C問題
問題の概要
N個の都市があり、都市iから都市jへ移動するには時間がかかります。
都市1を出発し、すべての都市を訪問してから都市1に戻る経路のうち
移動の合計時間がちょうどkとなるものはいくつあるか
制約
- 入力はすべて整数
どのように考えたか
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分後。
結果
コンテスト結果
ABCの3完でした。
B問題でとっっっても詰まりました。
こういう苦手をなくしていきたいです。
パフォーマンス、レーティング変動
今回のパフォーマンスは501、前回より270近くも下がってしまいました。
レーティングはそれに伴い-13の633となりました。
反省点
今回は、B問題が分からず、勘で書いたら通ったのですが、普通に解けるようにしたいなと思いました。
D問題を解かないとレートは伸びないので、日々の精進を忘れないようにしたいです。