题解:P1190 [NOIP2010 普及组] 接水问题
kuaiCreator · · 题解
解题思路
记录每个水龙头放水的时间,由于接水的顺序是固定的故只能依次去接水。让第
最后找到所有水龙头放水时间最长的即为所有人接完水时所花费的最短时间。
贪心策略证明:如果只有两个水龙头,两个人接水耗时为正数
代码实现
#include<bits/stdc++.h>
using namespace std;
priority_queue<int, vector<int>, greater<int> > tap;//创建小根堆
int p[10005], n, m, k;
int main() {
cin >> n >> m;
for (int i = 1; i <= n; i++) //输入n个人接水的时间
cin >> p[i];
for (int i = 1; i <= m; i++) //设置m个水龙头的放水时间为0
tap.push(0);
for (int i = 1; i <= n; i++) { //第i个人去找结束时间最短的水龙头接水
int temp = tap.top(); //取出用时最小的水龙头
tap.pop();
tap.push(temp + p[i]); //将放水后的水龙头入堆
}
for (int i = 1; i < m; i++) //弹出小根堆中元素只剩1个
tap.pop();
cout << tap.top(); //最终留下的元素为打水所划分总时间
return 0;
}