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