結果
問題 |
No.1947 質より種類数
|
ユーザー |
![]() |
提出日時 | 2025-03-31 17:45:06 |
言語 | PyPy3 (7.3.15) |
結果 |
WA
|
実行時間 | - |
コード長 | 2,519 bytes |
コンパイル時間 | 314 ms |
コンパイル使用メモリ | 82,232 KB |
実行使用メモリ | 71,412 KB |
最終ジャッジ日時 | 2025-03-31 17:45:59 |
合計ジャッジ時間 | 3,036 ms |
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
other | AC * 16 WA * 21 |
ソースコード
def main(): import sys input = sys.stdin.read().split() ptr = 0 N = int(input[ptr]) ptr += 1 V = int(input[ptr]) ptr += 1 C = int(input[ptr]) ptr += 1 items = [] for _ in range(N): v = int(input[ptr]) ptr += 1 w = int(input[ptr]) ptr += 1 items.append((v, w)) # Sort items by v ascending, then by w descending items.sort(key=lambda x: (x[0], -x[1])) # Precompute cumulative sums of v and w n = N sv = [0] * (n + 1) sw = [0] * (n + 1) for i in range(n): sv[i + 1] = sv[i] + items[i][0] sw[i + 1] = sw[i] + items[i][1] # Find k_max using bisect k_max = 0 left, right = 0, n while left <= right: mid = (left + right) // 2 if mid > n: right = mid - 1 continue if sv[mid] <= V: k_max = mid left = mid + 1 else: right = mid - 1 k_max = min(k_max, n) max_total = 0 # List to maintain items sorted by efficiency (w/v) in descending order sorted_by_efficiency = [] for k in range(1, k_max + 1): sum_v = sv[k] if sum_v > V: continue # Not possible, but due to k_max, this shouldn't happen rem = V - sum_v sum_initial_w = sw[k] # Get the current item (k-th item in first k items, which is items[k-1]) v, w = items[k - 1] efficiency = w / v # Find insertion position in sorted_by_efficiency using custom bisect for descending order left = 0 right = len(sorted_by_efficiency) while left < right: mid = (left + right) // 2 if sorted_by_efficiency[mid][2] > efficiency: left = mid + 1 else: right = mid pos = left # Insert the new item into the sorted list sorted_by_efficiency.insert(pos, (v, w, efficiency)) # Calculate additional w using the remaining money current_rem = rem sum_additional = 0 for item in sorted_by_efficiency: vi, wi, eff = item if current_rem <= 0: break cnt = current_rem // vi sum_additional += cnt * wi current_rem -= cnt * vi total = C * k + sum_initial_w + sum_additional if total > max_total: max_total = total # Handle k=0 case (no items bought) print(max_total) if __name__ == "__main__": main()