結果
問題 |
No.1522 Unfairness
|
ユーザー |
![]() |
提出日時 | 2025-03-31 18:00:48 |
言語 | PyPy3 (7.3.15) |
結果 |
WA
|
実行時間 | - |
コード長 | 1,658 bytes |
コンパイル時間 | 280 ms |
コンパイル使用メモリ | 82,176 KB |
実行使用メモリ | 77,252 KB |
最終ジャッジ日時 | 2025-03-31 18:02:04 |
合計ジャッジ時間 | 4,016 ms |
ジャッジサーバーID (参考情報) |
judge2 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 4 WA * 23 |
ソースコード
import bisect n, m = map(int, input().split()) A = list(map(int, input().split())) A.sort(reverse=True) k_max = n // 2 sum_initial_O = [0] * (k_max + 1) sum_d_initial = [0] * (k_max + 1) for k in range(1, k_max + 1): sum_initial_O[k] = sum_initial_O[k-1] + A[2*(k-1)] sum_d_initial[k] = sum_d_initial[k-1] + (A[2*(k-1)] - A[2*(k-1)+1]) max_result = 0 # Check all possible k from largest to smallest for k in range(k_max, 0, -1): current_initial_O = sum_initial_O[k] current_sum_d = sum_d_initial[k] if current_sum_d <= m: if current_initial_O > max_result: max_result = current_initial_O # Since this is the largest k possible, no need to check smaller k break else: required_reduction = current_sum_d - m required_d_sum = (required_reduction + 1) // 2 # Generate the list of d values for this k d_list = [] for i in range(k): d = A[2*i] - A[2*i + 1] d_list.append(d) # Sort d in descending order d_list_sorted = sorted(d_list, reverse=True) # Compute prefix sums prefix_sum = [0] for d in d_list_sorted: prefix_sum.append(prefix_sum[-1] + d) # Find the minimal t where prefix_sum[t] >= required_d_sum t = bisect.bisect_left(prefix_sum, required_d_sum) if t <= len(prefix_sum) - 1: current_candidate = current_initial_O - prefix_sum[t] if current_candidate > max_result: max_result = current_candidate # Check k = 0 case (O is 0) max_result = max(max_result, 0) print(max_result)