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;
}

注意涉及最值问题可以考虑用堆

posted @ 2026-03-28 22:07  Lambda_L  阅读(7)  评论(0)    收藏  举报