結果
| 問題 |
No.2617 容量3のナップザック
|
| コンテスト | |
| ユーザー |
titia
|
| 提出日時 | 2024-01-30 06:04:40 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
AC
|
| 実行時間 | 978 ms / 2,000 ms |
| コード長 | 1,084 bytes |
| コンパイル時間 | 137 ms |
| コンパイル使用メモリ | 82,564 KB |
| 実行使用メモリ | 254,248 KB |
| 最終ジャッジ日時 | 2024-09-28 10:11:53 |
| 合計ジャッジ時間 | 13,335 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge2 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 40 |
ソースコード
import sys
input = sys.stdin.readline
N,K,seed,a,b,m=map(int,input().split())
F=[seed]
for i in range(2*N-1):
F.append((F[-1]*a+b)%m)
V=[[],[],[]]
for i in range(N):
w=F[i]%3+1
v=F[i+N]*w
V[w-1].append(v)
for i in range(3):
V[i].sort(reverse=True)
S=[[0],[0],[0]]
for i in range(3):
for j in range(len(V[i])):
S[i].append(S[i][-1]+V[i][j])
ANS=0
# 3を何個取るか三分探索
def calc(three):
ANS=S[2][three]
rest=K-three
MAX=0
for i in range(rest+1):
rest2=i+(rest-i)*3
score=0
if i<len(S[1]):
score=S[1][i]
else:
score=S[1][-1]
if rest2<len(S[0]):
score+=S[0][rest2]
else:
score+=S[0][-1]
if MAX<score:
MAX=score
return MAX+ANS
MIN=0
MAX=min(K,len(V[2]))
while MAX-MIN>5:
mid1=MIN+(MAX-MIN)//3
mid2=MIN+(MAX-MIN)//3*2
c1=calc(mid1)
c2=calc(mid2)
if c1>c2:
MAX=mid2
else:
MIN=mid1
for i in range(MIN,MAX+1):
ANS=max(ANS,calc(i))
print(ANS)
titia