提交时间:2025-10-15 22:30:27
运行 ID: 38567
#include <bits/stdc++.h> using namespace std; #define int long long int n, A, cf, cm, m; int a[100005], sum[100005]; // 检查能否用m货币将前mid个技能提升到至少a[mid](即最小等级为a[mid]) inline bool check(int mid, int m_remaining) { if (mid == 0) return true; // 无技能需提升,直接满足 return (a[mid] * mid - sum[mid]) <= m_remaining; } signed main() { cin >> n >> A >> cf >> cm >> m; for (int i = 1; i <= n; ++i) cin >> a[i]; sort(a + 1, a + n + 1); // 升序排序,便于处理最小等级和升满高等级技能 // 计算前缀和 sum[0] = 0; for (int i = 1; i <= n; ++i) sum[i] = sum[i - 1] + a[i]; int initial_max = 0; // 初始满级技能数 for (int i = 1; i <= n; ++i) { if (a[i] == A) initial_max++; } int ans = initial_max * cf + a[1] * cm; // 初始能力值(未使用货币) int remaining_m = m; // 从后往前枚举升满的技能数(i表示当前考虑升满第i个技能,即排序后的高等级技能) for (int i = n; i >= 1; --i) { if (a[i] == A) continue; // 已满级,无需提升 int cost = A - a[i]; if (remaining_m < cost) break; // 货币不足,无法升满更多技能 remaining_m -= cost; a[i] = A; // 升满当前技能 // 二分查找前i-1个技能能达到的最高最小等级 int l = 0, r = i - 1, best_min = 0; while (l <= r) { int mid = (l + r) / 2; if (check(mid, remaining_m)) { best_min = mid; // mid个技能可提升到a[mid],尝试更大mid l = mid + 1; } else { r = mid - 1; } } // 计算当前方案的能力值 int current_cf = (n - i + 1); // 升满的技能数(从i到n) int current_cm = (best_min == 0) ? 0 : a[best_min]; // 最小等级(前best_min个技能的最小值) ans = max(ans, current_cf * cf + current_cm * cm); } cout << ans << endl; return 0; }