競プロ弱者の解答

競プロ弱者の成長記録

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

前回のABC155でD,Eが解けず、3回連続でレートが下がってます。
もう少し時間があればDは解けたのに・・
後半の問題を解くための時間を確保するためには、前半を早解きするしかないですね。
と言うわけで、今日も過去のABCの復習で精進しました。

〇コンテスト名:ABC096

〇配点:不明

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

〇今回の方針

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

 ABC097はミスが多く4ペナだったので、今回はノーミスを狙います。

コンテスト開始!
A - Day of Takahashi

2018年1月1日~2018年a月b日までの間に、月と日の数字が同じになる日が何回あるか求めよ。
1月1日、2月2日、3月3日・・a<=b ならa回、そうでなければa-1回ですね。

a,b=map(int,input().split())
if a<=b:
    print(a)
else:
    print(a-1)

2:07 AC

B - Maximum Sum
1以上の整数A,B,Cが与えられる。任意の数字を2倍する操作をK回行った後のA+B+Cの最大値を求めよ。
1番大きい数字を2倍し続けるのが最善でしょう。
どうやって1番大きい数字を探すかですが、ifをたくさん書いても良いのですが、
A,B,Cをリストに入れておいて、ソートするのが簡単だと思います。
入力の段階からA,B,Cではなく、listで受けました。

List=list(map(int,input().split()))
List.sort()
K=int(input())
for i in range(K):
    List[2]*=2
print(sum(List))

4:40 AC

C - Grid Repainting 2

キャンパスが"."と"#"で埋められている。"#"は全て上下左右のいずれかに"#"が隣接していればYes、そうでなければNoを出力せよ。
キャンパス上を全探索して、"#"であった場合は上下左右のいずれかに"#"があることを確認。
この手の問題は、キャンパスの外周を"."で囲ってしまえば、渕の部分での境界を気にしなくて良いですね。
また、X=[1,-1,0,0] Y=[0,0,1,-1]とし、for i in range(4);で上下左右を確認するのもお約束ですね。

 H,W=map(int,input().split())

L=[]
l=["." for i in range(W+2)]
L.append(l)
for i in range(H):
    S=["."]+list(input())+["."]
    L.append(S)
L.append(l)

X=[1,-1,0,0]
Y=[0,0,1,-1]
for h in range(1,H+1):
    for w in range(1,W+1):
        if L[h][w]=="#":
            F=0
            for i in range(4):
                if L[h+X[i]][w+Y[i]]=="#":
                    F=1
            if F==0:
                print("No")
                exit()
print("Yes")

11:02 AC

D - Five, Five Everywhere
5~55の整数Nが与えられる。
異なる素数N個を並べ、どの5つを選んでも合成数となる数列を作成せよ。
まずは素数を並べろというので、素数を集めましょう。
素数といえばエラトステネスの篩。
①中身が全て1のリストを作成
②リストの0番と1番を0にする
③リストを順に見ていき、for i in range((2,N): list[i]が1であればfor j in range(2,N):でループを回し、list[i][j]を0にする。
④リストの1になっている部分が素数

そして、どの5個を選んでも合計が合成数になる組み合わせ。
下1桁が1の素数をN子集めれば良いですね。
(解いた後で気づきましたが、下1桁が1である必要はなく、下1桁がそろってさえいれば5個の合計の1の位は5になるわけで、必ず合成数になりますね。
それに気づけばあとは書くだけ。

P=[1 for i in range(55556)]
P[0]=0
P[1]=0
for i in range(2,55556):
    if P[i]==1:
        for j in range(2,55556):
            if i*j<=55555:
                P[i*j]=0
            else:
                break

ans=[]
for i in range(55556):
    if P[i]==1 and i%10==1:
        ans.append(i)
N=int(input())
print(*ans[:N])

19:14 AC

結局 19:14で全完(4完)0ペナでした。
当時は約90分で4ペナながらも全完してパフォ1200オーバー!
ちなみに、当時のレートは・・ゼロ!
なんとこのコンテストが私のはじめてのコンテストでした。
いや、今でもレートは1300ちょっとしかないんですけど・・
ほとんど成長していない?