pythonプログラミング勉強競技プログラミング

ABC 173

スポンサーリンク

ひっさびさ4完+連続レート上昇

 50分付近までAB2完の激冷えの予感が漂ったが、Cはビット全探索でもしかしていくのでは?とぱっと見時点で思っていたが、計算量や実装が多いように思いためらっていたが一応実装してみたところ割とあっさり実装できた。とはいえこれがパフォ600とかレベル上がりすぎじゃないですかね?(2年前と比較していることがおかしいのかもしれないですが)
 Dはまんまと愚直にサンプルから読める内容をコードにして提出し、1WA。Dまで来てそんな簡単なわけねーだろ何かのアルゴリズムが?と思いつつもノートに10,9,8,7,6,5,4,3,2,1,のセットで考えたところ、大きい方からソートして最大の値以降は2回づつ取りえるということに気づく。

 大した内容ではないが実装に相当てこずり、85分の時点でやっと完成。思考は難しいが実装はそうでもない気がする(神レベルの方は証明とか考えておられましたけどそんなこと考えるわけもなく)
 5問目は15分しか使えないし、難しそうな感じがするのであきらめる。場合分けすれば行けそうだがどうだろうか?素早く実装することも重要だなと思いつつも、ビット全探索や、よく使う機能はすぐコピペできるようにしていたので何とかなった感が強い。

C問題

import copy
 
H,W,K=map(int,input().split())
S = [["" for j in range(W)] for i in range(H)]
 
 
for i in range(H):
    tm=input()
    for j in range(W):
        S[i][j]=tm[j]
 
 
 
anscount=0
 
for i in range(2 **(H+W)):
    tmp=copy.deepcopy(S)
    for j in range(H+W):
        if ((i >> j) & 1):
            #print(i,j)のjbitがONの意味
            if j<H:
                for k in range(W):
                    tmp[j][k]="."
            else:
                for k in range(H):
                    tmp[k][j-H]="."
    tmpcount=0
    #print(tmp)
    for k in range(H):
        for l in range(W):
            if tmp[k][l]=="#":
                tmpcount+=1
    if tmpcount==K:
        anscount+=1
        
print(anscount)

D問題 実装は簡単なはずなのだが相当な時間を浪費した

N=int(input())
S=list(map(int,input().split()))
S.sort()
S.reverse()
tmp=0
ans=0
if len(S)==2:
    print(S[0])
    
else:
    ans+=S[0]
 
    if (N-2)%2==0:
        for i in range((N-2)//2):
            ans+=S[i+1]*2
        #print("mohu1")    
        print(ans)
    else:
        for i in range((N-2)//2):
            
            ans+=S[i+1]*2
            tmp=i+1
        #print("mohu")
        print(ans+S[tmp+1])

コメント

タイトルとURLをコピーしました