31日目: Beginner 47
31日目(2019/9/20)
AtCoder Beginner Contest 047
解けた問題
A:キャンディーと2人の子供 / Fighting over Candies
a == b+c || b == a+c || c == a+b
で判定しました。もっと上手な判定方法あるかな?
B:すぬけ君の塗り絵 2 イージー / Snuke's Coloring 2 (ABC Edit)
W,Hの最大が100だったので、最大100x100の盤を作成して、条件が出るたびに更新する手法にしました。あんまりスマートではないと思うけど、多分ACできるかなって思いながらコーディングしました。
// C++のテンプレート #include <iostream> #include <string> #include <algorithm> #include <vector> using namespace std; int main(void){ int W,H,N; cin >> W >> H >> N; vector<vector<bool>> board(H,vector<bool>(W)); int x,y,a; for(int iter=0;iter<N;iter++){ cin >> x >> y >> a; switch(a){ case 1: for(int i=0;i<H;i++){ for(int j=0;j<x;j++){ board[i][j] = true; } } break; case 2: for(int i=0;i<H;i++){ for(int j=x;j<W;j++){ board[i][j] = true; } } break; case 3: for(int i=0;i<y;i++){ for(int j=0;j<W;j++) board[i][j] = true; } break; case 4: for(int i=y;i<H;i++){ for(int j=0;j<W;j++){ board[i][j] = true; } } } } int count = 0; for(int i=0;i<H;i++){ for(int j=0;j<W;j++) if(!board[i][j]) count++; } cout << count << endl; }
タスクがたくさんあってちょっとまずいので、今日も2問だけでお茶濁す感じで…(しっかり取り組まないと)
30日目:Beginner 46
30日目(2019/9/19)
AtCoder Beginner Contest 046
最近更新頻度が落ちてきてていけない…。
解けた問題
A:AtCoDeerくんとペンキ / AtCoDeer and Paint Cans
数をそれぞれ受け取って、値同士を比較して結果を返したよ。
B:AtCoDeerくんとボール色塗り / Painting Balls with AtCoDeer
パターンを考える問題。まず1つ目の球を塗るときのパターンは、K色のなかから選ぶから、K
パターン。2つ目の球を塗るときのパターンは、1つ目に選んだやつとかぶっちゃいけないので、K-1
パターン。3色目は、2つ目に選んだやつとかぶっちゃいけないけど、1つ目に選んだものは選んでもいいのでK-1
パターン。
つまり、N(N>1)番目に選ぶパターン数はK-1
で表されるので、それをループで表せば良い。答えの桁数が多いのでカウントする変数はlong long
型にしました。
#include <iostream> #include <cmath> using namespace std; int main(void){ int N,K; long long pat; cin >> N >> K; pat = K; for(int i=1;i<N;i++){ pat *= (K-1); } cout << pat << endl; }
出先でちょこっとやってCは時間なさそうだったのでこのへんで…。
28日目:Begineer 44
28日目(2019/9/15)
AtCoder Beginner Contest 044
解けた問題
A: 高橋君とホテルイージー / Tak and Hotels (ABC Edit)
K日目を超えているかで分岐しました!
if(N<K){ cout << X*N; }else{ cout << X*K + Y*(N-K); }
B:美しい文字列 / Beautiful Strings
char
型から'a'
を引くと何文字目かが取れる、ということを利用して、アルファベットの数をカウント、全部ループして確認しました。
// C++のテンプレート #include <iostream> #include <string> #include <algorithm> #include <vector> using namespace std; int main(void){ int alp[26] = {}; string w; cin >> w; for(int i=0;i<w.size();i++){ alp[w[i]-'a']++; } bool tf=true; for(int i=0;i<26;i++) if(alp[i]%2==1){ tf=false; break; } if(tf) cout << "Yes" << endl; else cout << "No" << endl; }
27日目:Beginner 43
27日目(2019/9/13)
AtCoder Beginner Contest 043
解けた問題
A:キャンディーとN人の子供イージー / Children and Candies (ABC Edit)
1~N
までの総和を求める問題。for文で回して、合計を出力したよ。
B: バイナリハックイージー / Unhappy Hacking (ABC Edit)
3つしかないキーボードって凄いなって思ったけど、そういえば今年の5月だかに自作キーボードのすすめ、みたいな勉強会が開かれてて先輩に誘われて興味本位で行ったのを思い出した。奇抜なデザインで面白いなって思ったけど使うのちょっと大変そうだな(慣れたらきっと凄く早いんだろうなって思うけれど)って思った。っていうのはおいておいて、
C++のstringクラスを使って、0と1が来たときは後ろに追加、Bが来たときは、string.empty()
で確認して、からじゃなければstring.pop_back()
を使って文字列を削除したよ。
C:いっしょ / Be Together
問題の制約的に、総当りしてもいいかなって思いました。ので、-100~100までの範囲で全部計算して、最小の値が出てきたら更新、を繰り返し最後に出力してACになりました!
解けなかった問題
時間なくてA,B,Cしか取り組んでないです…
26日目:Beginner 042
26日目(2019/9/12)
AtCoder Beginner Contest 042
昨日はゼミの合宿でした。
解けた問題
A:和風いろはちゃんイージー / Iroha and Haiku (ABC Edition)
5と7の出た数をカウントして、5が2個、7が1個ならYESを出力!
B:文字列大好きいろはちゃんイージー / Iroha Loves Strings (ABC Edition)
stringクラスは比較演算子で辞書順に並べてくれるので、sortして、順番に出力しただけでした。
// C++のテンプレート #include <iostream> #include <string> #include <algorithm> #include <vector> using namespace std; int main(void){ int N,L; cin >> N >> L; vector<string> S(N); for(int i=0;i<N;i++) cin >> S[i]; sort(S.begin(),S.end()); for(int i=0;i<N;i++){ cout << S[i]; } cout << endl; }
解けなかった問題
C:こだわり者いろはちゃん / Iroha's Obsession
いろいろとこんがらがってしまった…。加算器の実装のイメージで繰り上がりを考えて…ってやってたらごちゃごちゃになってしまいました。
解説を見てみる
C:
制約を見ていなかった…!1~10000だから、全通り調べてみて、総当りしても良さそうでしたね!
25日目:Beginner 41
25日目(2019/9/10)
AtCoder Beginner Contest 041
解けた問題
A:添字
string
型でi-1
を出力すればおk
B:直方体
数がめちゃくちゃ大きくなってしまうので、A*B
をした時と、(A*B)*C
に値を10^9+7
でmodをとって出力しました。
C:背の順
Studentクラスを作成して、出席番号と身長を記録するようにして、operator<
をオーバーロードして、身長でソートしました!
だめかな?って思ったら普通にAC通った!
// C++のテンプレート #include <iostream> #include <string> #include <algorithm> #include <vector> using namespace std; class Student{ public: int num; int height; bool operator<(const Student &another) const { return height < another.height; } }; int main(void){ int N; cin >> N; vector<Student> a(N); for(int i=0;i<N;i++){ a[i].num = i; cin >> a[i].height; } sort(a.begin(),a.end()); for(int i=N-1;i>=0;i--){ cout << a[i].num+1 << endl; } }
解けなかった問題
D:徒競走
なぜか実際の並び順を考えてしまったけれど、その通り数を考えるんだからダメじゃん…、どうやって数えればよかったんだろう?
解説を見てみる
D
どうやら、トポロジカルソート
をする問題らしい、聞いたことあるようなないような…。
問題を有向グラフ問題と考えて、横一列に並べたときに全て同じ向きを向くようなソートの仕方を指すらしく、N<=8のときは、最大ステップ数的にも全探索して良いみたい。これで部分点は取れるみたいですね。