ABC186に参加しました
AtCoderのコンテストに参加した際の結果と考え方、反省点などを書いていきます。
コンテストページはこちら
解いた/挑んだ問題
A問題
問題の概要
Nキロまで荷物を載せられるトラックにWキロのレンガはいくつ乗せられるか
制約
- N,Wは整数である
どのように考えたか
N/Wの小数点以下切り捨てを出力した
結果
一発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,w; cin >> n >> w; cout << n/w << endl; return 0; }
最初荷物とトラックの積載量を逆にしてて焦った
ACまでの時間
ACしたのはコンテスト開始から1分後です。
B問題
問題の概要
縦Hマス、横Wマスに個ブロックが置かれている
全てのマスでブロックを同じにするとき、何個ブロックを取り除く必要があるか
制約
どのように考えたか
与えられるブロックの中の最小値*H*Wを与えられたすべてのブロックから引いた
結果
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, 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 h ,w,a,ans=0,tmp=0,mi=100000,sum=0; map<int,int>mp; cin >> h >> w; rep(i,h)rep(j,w){ cin >> a; sum += a; chmin(mi,a); mp[a]++; } ans = sum -= mi*h*w; cout << ans << endl; return 0; }
少し戸惑ったが、全体から余計な分を引くといいことが分かってから安心して実装できた
ACまでの時間
ACしたのはコンテスト開始から5分後です。
C問題
問題の概要
1以上N以下の数を10進法と8進法で表したとき7が含まれない数の個数はいくつあるか
制約
- Nは整数である
どのように考えたか
1~Nまでを10進数と8進数に変換する過程で7が見えたらカウントせず、それ以外はカウント
結果
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, 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() { bool f=false,ff=false; int n,cnt=0,t,tt; cin >> n; REP(i,n){ f = ff = false; t = tt = i; while(t){ if(t%10==7){f = true;break;} t/=10; } while(tt){ if(tt%8==7){ff=true;break;} tt/=8; } if(!f && !ff)cnt++; } cout << cnt << endl; return 0; }
最初難しそうと思って敬遠してたら割と簡単だった
ACまでの時間
ACしたのはコンテスト開始から71分後。
D問題
問題の概要
を求めよ
制約
- は整数である
どのように考えたか
全ての組についての絶対値をとるので数列はソートしても答えは変わらないので絶対値を外してもいいように大きい順にソートする
は、と変わらないので、累積和をとり総和を高速に計算し
まで先ほどの操作を行う
結果
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, 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() { ll n,a,ans=0; cin >> n; vector<ll>arr(n),arrsum(n+1,0); rep(i,n)cin >> arr[i]; sort(rall(arr)); rep(i,n){ arrsum[i+1] = arrsum[i] + arr[i]; } rep(i,n){ ll tmp = arrsum[n] - arrsum[i+1]; ll res = arr[i] * (n-i-1); ans += (res - tmp); } cout << ans << endl; return 0; }
以前どこかで見かけたような問題で早く法則性に気づくことができた
ACまでの時間
ACしたのはコンテスト開始から20分後。
結果
コンテスト結果
ABCDの4完でした。
ABDはよかったが、半ばあきらめていたC問題に挑んだら意外とあっさり解けてもっと早く解けばよかったと思った
パフォーマンス、レーティング変動
今回のパフォーマンスは、705前回より450近く下がりました(前回が良かったのもありますが・・・)
レーティングはそれに伴い+4の670となりました。
反省点
今回はC問題を軽く試して無理だと思ってD問題に行ったのはよかったのですが、その後C問題に行かずにEFを考え始めてしまい
C問題を解くのがとても遅れてしまいました。
そのおかげがパフォがあまりよくなかったのかなと思うので、問題を飛ばしても時間を気にかけて早めに解くようにしたいです
それはそうと今回は年内最後のABCなのでとりあえずレートが冷えなくてよかったです
密かに年内緑を目指していたのですが叶わずじまいでした。来年の3月までには緑になりたいです!!