競プロ弱者の解答

競プロ弱者の成長記録

ABC100(バーチャル):水色競プロerの復習

今日は休日ですが、AtCoderのコンテストはありません。

こんな日は過去問の復習をしましょう。

過去に苦戦した問題を解くのも良いですが、コンテスト気分を味わいたくてバーチャルコンテストにしました。

問題は何も考えずにABC100に決定(この時点では参加したか否かの確認も無し。特別な用事がなければ参加しているはずですが。)。

 

〇コンテスト名:ABC100

〇配点:不明

〇制限時間100分(A~Dまでの4問の時代のコンテスト)

〇今回の方針

 本番のコンテストのつもりで解く

 考察は早く、でもWA気にせず適当にぶん投げるのは無し

 

コンテスト開始!
A - Happy Birthday!
丸いケーキを16等分した。A,Bの2人で分けるが隣り合うケーキは同じ人が取ってはならない。A,Bどちらも欲しいだけケーキをとれるか?
テストケースに絵が描いてあって親切ですね。
A,Bともに8切れまでしかとれないことがわかります。
A,Bともに8以下ならYay!、そうでなければ:(を出力。
E869120 さんとsquare1001さんの双子の問題は出力が変わっていることが多いですね。Yay!はまだ良いとしても、:(はコピペで持ってこないと危険ですね。これの入力ミスでWAを食らったら目も当てられません。

A,B=map(int,input().split())
if A<=8 and B<=8:
    print("Yay!")
else:
    print(":(")

1:42 AC

B - Ringo's Favorite Numbers
100でちょうどD回割り切れるN番目の数を出力せよ。
何言ってるかわかりにくい問題文ですが、テストケースを見ればわかりますね。
制約を見れば、Dは0,1,2でNは100まで。
基本的にNに100のD乗をかければ良いですが、Nが100の時だけ注意!
Dが1でNが100の場合、10000を出力するとWA。10000は100で二回割り切れますからね。
制約条件から、100の時だけ別処理(Nを101にしてしまえば良いでしょう)

D,N=map(int,input().split())
if N==100:
    N=101
print(N*100**(D))

5:28 AC

C - *3 or /2
問題文見た瞬間「はいコラッツ!」
違いました。
問題文を読んでテストケースを見て、問題が「2で何回割れるか?」であることを理解するまでの時間の勝負。
3をかける意味はありません。
このへんは慣れでしょうか。
問題文が「2で何回割れるか?」になれば難しくはないはず。

N=int(input())
A=list(map(int,input().split()))
ans=0
for i in range(N):
    while A[i]%2==0:
        A[i]//=2
        ans+=1
print(ans)

7:59 AC

D - Patisserie ABC
M個のケーキのxの和の絶対値+yの和の絶対値+zの和の絶対値の最大値はいくつか?
絶対値と言うことは、マイナスの場合も考慮しないといけませんね。
きれいさ、おいしさがマイナスのケーキってどんなケーキだよ?と言うのはここでは考えません。
3種類(x、y、z)の正と負で2**3=8個のリストを用意して、
x,y,z全てが正のリストはLPPP
xが正でy,zが負のリストはLPMM
(Lはリストの頭文字、Pはプラス、Mはマイナスのイメージで付けました)
みたいな感じで各リストの上位M個を比べて一番大きいものを出力!
文字で説明よりコードを見た方が速いでしょう。

N,M=map(int,input().split())

LPPP=[]
LPPM=[]
LPMP=[]
LPMM=[]
LMPP=[]
LMPM=[]
LMMP=[]
LMMM=[]
for i in range(N):
    x,y,z=map(int,input().split())
    LPPP.append(x+y+z)
    LPPM.append(x+y-z)
    LPMP.append(x-y+z)
    LPMM.append(x-y-z)
    LMPP.append(-x+y+z)
    LMPM.append(-x+y-z)
    LMMP.append(-x-y+z)
    LMMM.append(-x-y-z)
    
LPPP.sort(reverse=True)
LPPM.sort(reverse=True)
LPMP.sort(reverse=True)
LPMM.sort(reverse=True)
LMPP.sort(reverse=True)
LMPM.sort(reverse=True)
LMMP.sort(reverse=True)
LMMM.sort(reverse=True)
print(max(sum(LPPP[:M]),sum(LPPM[:M]),sum(LPMP[:M]),sum(LPMM[:M]),sum(LMPP[:M]),sum(LMPM[:M]),sum(LMMP[:M]),sum(LMMM[:M])))

19:15 AC

全て解いたことのある問題だったので、何なく解けました。
と言うか、このコンテストにはリアルタイムで参加して全完していますね!
しかも当時(約1年8カ月前)の私のレートは646でこの回のパフォ1480!!
今のレートは1300ちょっとなので、今でもパフォ1480はなかなか出ません。まるで成長していない・・