3月28日洛谷蓝桥杯省赛模拟补题
E 采矿文明
https://www.luogu.com.cn/problem/P15967?contestId=314564
这道题就相当于在能到达的范围内找k个矿井进行开采,也就是我们可以从1遍历到n,然后去除路费,再找k个矿井,然后看最多能采多少个。
void solve()
{
priority_queue<int, vi, greater<>> p;
cin >> n >> m >> k;
vi c(n + 1), a(n + 1), pre(n + 1);
for (int i = 2; i <= n; i++)
{
cin >> c[i];
pre[i] = pre[i - 1] + c[i];
}
for (int i = 1; i <= n; i++)
{
cin >> a[i];
}
int ans = 0;
int sum = 0;
for (int i = 1; i <= n; i++)
{
if (m < pre[i])
{
break;
}
p.push(a[i]);
sum += a[i];
int now = m - pre[i];
if (p.size() > k)
{
sum -= p.top();
p.pop();
}
int res = min(sum, now);
ans = max(ans, res);
}
cout << ans << endl;
}
注意 :涉及最值问题可以考虑用堆

浙公网安备 33010602011771号