[BOJ]分配11941ハンバーグ(Python)
テーブルの上にハンバーガーと人が置いてあり、一定距離しか食べられないハンバーガーの場合、問題はハンバーガーが食べられる人の数を見つけることです.グリディアルゴリズムのビデオを見て、関連問題を解いた.
サンプル入力と任意入力の値が正しい値に出力され、コミット後にタイムアウトが発生します.
サンプル入力と任意入力の値が正しい値に出力され、コミット後にタイムアウトが発生します.
タイムアウトコード
import sys
N,K=map(int,sys.stdin.readline().split())
cnt=0
change=[0 for x in range(N)]
perli=list(map(str,sys.stdin.readline().strip()))
for i in range(len(perli)):
if perli[i]=='P':
if i-K>=0:
perli[0:i-K]=change[0:i-K]
perli[i]=0
newli=perli[i-K:i+K+1]
for x in range(len(newli)):
if newli[x]=='H':
newli[x]=0
cnt+=1
perli[i-K:i+K+1]=newli
break
else:
perli[i]=0
newli2=perli[:i+K+1]
for y in range(len(newli2)):
if newli2[y]=='H':
newli2[y]=0
cnt+=1
perli[:i+K+1]=newli2
break
print(cnt)
これはmin,max関数を用いて簡単に解くことができる提案に基づいて作成されたコードである.上のコードよりずっと簡単です.リファレンスコード
import sys
N,K=map(int,sys.stdin.readline().split())
li=list(map(str,sys.stdin.readline().strip()))
cnt=0
for i in range(N):
if li[i]=='P':
minid=max(0,i-K)
maxid=min(i+K,len(li)-1)
for k in range(minid,maxid+1):
if li[k]=='H':
cnt+=1
li[k]='0'
break
print(cnt)
しかし、最初に作成したコードで完成させたいので、既存のコードから不要な部分を削除し、コードを修正しました.最初のコードは入力配列で参照されなくなったすべての要素の値を変更し、今回は参照する区間を設定し、条件に合致する要素の値だけを変更しました.タイムアウトコードを変更して成功したコード
import sys
N,K=map(int,sys.stdin.readline().split())
cnt=0
perli=list(map(str,sys.stdin.readline().strip()))
for i in range(len(perli)):
if perli[i]=='P':
if i-K>=0:
if i+K>=len(perli):
for x in range(i-K,len(perli),1):
if perli[x]=='H':
perli[x]=0
cnt+=1
break
else:
for x in range(i-K,i+K+1):
if perli[x]=='H':
perli[x]=0
cnt+=1
break
else:
for y in range(0,i+K+1):
if y>=len(perli):break
elif perli[y]=='H':
perli[y]=0
cnt+=1
break
print(cnt)
Reference
この問題について([BOJ]分配11941ハンバーグ(Python)), 我々は、より多くの情報をここで見つけました https://velog.io/@lj05117/BOJ-11941-햄버거-분배-Pythonテキストは自由に共有またはコピーできます。ただし、このドキュメントのURLは参考URLとして残しておいてください。
Collection and Share based on the CC Protocol