CSP历年复赛题-P1190 [NOIP2010 普及组] 接水问题

原题链接:https://www.luogu.com.cn/problem/P1190

题意解读:n个人在m个水龙头排队接水,每个人接水量不同,接完水的排队的人可以接上,求总的接水时间。

解题思路:

1、先把前m个人安排在m个水龙头

2、对于m后面的每一个人,都排在目前m个水龙头总接水时间最短的后面

3、最后看m个水龙头最大的累计接水时长即可

如何快速或者m个水龙头总接水时间最短的?可以借助优先队列,小根堆,最后结果就是队列最大的元素即最后一个。

100分代码:

#include <bits/stdc++.h>
using namespace std;

const int N = 10005, M = 105;
int n, m;

priority_queue<int, vector<int>, greater<int>> q;

int main()
{
    cin >> n >> m;
    int w;
    for(int i = 1; i <= n; i++)
    {
        cin >> w;
        if(q.size() < m) q.push(w); //如果队列不足m,则入队
        else  //如果队列超过m
        {
            int ww = q.top() + w; //将队首出队,加上当前接水量,再次入队
            q.pop();
            q.push(ww);
        }
    }

    while(q.size() > 1) q.pop();
    cout << q.top(); //最后一个即最大值

    return 0; 
}

 

posted @ 2024-05-28 15:40  五月江城  阅读(77)  评论(0编辑  收藏  举报