A - Happy Birthday!
入力:
出力: 可能なら'Yay!', そうでなければ ':('
「隣り合う2切れのケーキを両方取る」というのは、AかBどちらかが8より大きければ発生することなので、
if(A > 8 || B > 8) { writeln(":("); return; } else { writeln("Yay!"); }
でいいです。
感想: Aなのに問題文が少しむずかしい。
B - Ringo's Favorite Numbers
入力:
出力: 100でちょうど回割り切れるN番目に小さい整数
アアアアアアアアアアアアアアアアアアアーーーーー。
とりあえず、のときとそうでないときで分けて考えよう。
if(D == 0) { if(N == 100) writeln(101); else writeln(N); } else if(D == 1) { if(N == 100) writeln(100*101); else writeln(100*N); } else { if(N == 100) writeln(100*100*101); else writeln(10000*N); }
感想: ABCをやってきて一番WAしたB問題。制約を読もう。双子が悪魔に見える。
C - *3 or /2
入力:
出力: 最大の操作回数
この問題、いかにしてを2で割れるのか、というところだけに注目すれば解くことができます。
一回一回の操作で「2で割れる要素のうち1つを決めて除算をし、それ以外は3倍する」ことをすれば、最大の操作回数となるようにできます。3倍しても、2で割れる回数は変わりませんので。
ulong cnt; foreach(i; a) { while(!(i & 1)) { i /= 2; cnt++; } } cnt.writeln;
感想: B問題より簡単に感じた。
D - Patisserie ABC
入力:
出力:
sortして、 というふうに6通りに分けてやればいいんじゃね?!とか思ってたらWAしました。その後いろいろ試すもWAWAWAのWA。方針が間違っている。
ということで、コンテスト中には解けなかったのですが、よい考え方があるので、それを紹介します。
まず、仮に今回の制約でが0以上だったと仮定すると、明らかに、ケーキ毎にの総和をとり、その総和が大きい順からM個とってそれらの和をとればよいとわかります。
ケーキの総和をと表し、数列を降順にソートしたとすると、和はで表されます。
次に、今回と同じ制約で、が負の値もとることがあるとしましょう。
ところで、はのとき、そうでないときであることはご存知かと思います。
したがってといえます。
よってですね。
だから、です。
要は、絶対値まわりの処理が面倒なので、最初から各ケーキについて八通りのありうる値のとり方を計算しておけば楽なわけです。
この八通りについて、それぞれのパターンでケーキの価値の総和をとっておきます。そうすると、その8つのうちの最大値が求める値になります。
alias Cake = Tuple!(long, "x", long, "y", long, "z", long[], "score"); void main() { auto ip = readln.split.to!(long[]), N = ip[0], M = ip[1]; Cake[] cakes; foreach(_; 0..N) { auto ip2 = readln.split.to!(long[]), a = ip2[0], b = ip2[1], c = ip2[2]; long[] score; foreach(i; [1,-1]) foreach(j; [1,-1]) foreach(k; [1,-1]) { score ~= a*i+b*j+c*k; } cakes ~= Cake(a, b, c,score); } ulong res; foreach(i; 0..8) { cakes.sort!((a, b) => a.score[i] > b.score[i]); res = max(res, calc(cakes[0..M])); } res.writeln; } ulong calc(Cake[] cakes) { long beat, deli, popu; foreach(i; cakes) { beat += i.x; deli += i.y; popu += i.z; } return abs(beat)+abs(deli)+abs(popu); }
感想: めっっっちゃ頑張ってsortでゴリ押ししようとしたけどダメだった。精進しなきゃいけないですね。
A: Submission #2674649 - AtCoder Beginner Contest 100
B: Submission #2682146 - AtCoder Beginner Contest 100
C: Submission #2677346 - AtCoder Beginner Contest 100
D: Submission #2689798 - AtCoder Beginner Contest 100