結果
| 問題 |
No.2617 容量3のナップザック
|
| コンテスト | |
| ユーザー |
qwewe
|
| 提出日時 | 2025-05-14 13:22:51 |
| 言語 | PyPy3 (7.3.15) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 3,409 bytes |
| コンパイル時間 | 190 ms |
| コンパイル使用メモリ | 82,904 KB |
| 実行使用メモリ | 173,936 KB |
| 最終ジャッジ日時 | 2025-05-14 13:25:09 |
| 合計ジャッジ時間 | 13,922 ms |
|
ジャッジサーバーID (参考情報) |
judge3 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| sample | AC * 2 |
| other | AC * 17 WA * 23 |
ソースコード
import sys
def solve():
N, K, seed, a, b, m = map(int, sys.stdin.readline().split())
f_values = [0] * (2 * N)
# Constraints: 1 <= K <= N <= 10^6, so N is at least 1.
# Thus, 2*N is at least 2, so f_values will have at least 2 elements if N=1.
# The list f_values will be indexed 0 to 2*N-1.
f_values[0] = seed
for i in range(2 * N - 1): # Computes f_values[1] through f_values[2*N-1]
f_values[i+1] = (a * f_values[i] + b) % m
items1_vals = [] # Values of items with weight 1
items2_vals = [] # Values of items with weight 2
items3_vals = [] # Values of items with weight 3
# Note on indexing: problem uses 1-based, Python uses 0-based.
# f_i (1-based) corresponds to f_values[i-1] (0-based).
# w_i = f_i % 3 + 1
# v_i = w_i * f_{N+i}
# In 0-based:
# w_idx = f_values[idx] % 3 + 1
# v_idx = w_idx * f_values[N+idx]
# where idx ranges from 0 to N-1.
for i in range(N): # i from 0 to N-1
w_i = f_values[i] % 3 + 1
v_i = w_i * f_values[N + i]
if w_i == 1:
items1_vals.append(v_i)
elif w_i == 2:
items2_vals.append(v_i)
else: # w_i == 3
items3_vals.append(v_i)
items1_vals.sort(reverse=True)
items2_vals.sort(reverse=True)
items3_vals.sort(reverse=True)
p1, p2, p3 = 0, 0, 0 # Pointers for items1_vals, items2_vals, items3_vals
total_value = 0
len1, len2, len3 = len(items1_vals), len(items2_vals), len(items3_vals)
for _ in range(K):
current_options = [] # List of (value_of_this_knapsack_choice, type_tag_for_advancing_pointers)
# Option W3: One item of weight 3
if p3 < len3:
current_options.append((items3_vals[p3], "1w3"))
# Option W2+W1: One item of weight 2 and one item of weight 1
if p2 < len2 and p1 < len1:
current_options.append((items2_vals[p2] + items1_vals[p1], "1w2_1w1"))
# Option W1+W1+W1: Three items of weight 1
if p1 + 2 < len1: # Needs items at p1, p1+1, p1+2
current_options.append((items1_vals[p1] + items1_vals[p1+1] + items1_vals[p1+2], "3w1"))
# Option W2 (alone): One item of weight 2
if p2 < len2:
current_options.append((items2_vals[p2], "1w2"))
# Option W1+W1 (alone): Two items of weight 1
if p1 + 1 < len1: # Needs items at p1, p1+1
current_options.append((items1_vals[p1] + items1_vals[p1+1], "2w1"))
# Option W1 (alone): One item of weight 1
if p1 < len1:
current_options.append((items1_vals[p1], "1w1"))
if not current_options:
# No more items can be combined to form any knapsack configuration
break
current_options.sort(key=lambda x: x[0], reverse=True)
best_val_for_knapsack, best_type = current_options[0]
total_value += best_val_for_knapsack
if best_type == "1w3":
p3 += 1
elif best_type == "1w2_1w1":
p2 += 1
p1 += 1
elif best_type == "3w1":
p1 += 3
elif best_type == "1w2":
p2 += 1
elif best_type == "2w1":
p1 += 2
elif best_type == "1w1":
p1 += 1
sys.stdout.write(str(total_value) + "\n")
solve()
qwewe