Codevs 1127 接水问题&&3377 [Mz]接水问题2
来源:互联网 发布:淘宝怎么改购买数量 编辑:程序博客网 时间:2024/06/05 07:41
/总结写在前:两个题都是通过优先队列实现,只不过在排不排序上有区别/
//1127
题目描述 Description
学校里有一个水房,水房里一共装有m 个龙头可供同学们打开水,每个龙头每秒钟的供水量相等,均为1。
现在有n 名同学准备接水,他们的初始接水顺序已经确定。将这些同学按接水顺序从1到n 编号,i 号同学的接水量为wi。接水开始时,1 到m 号同学各占一个水龙头,并同时打开水龙头接水。当其中某名同学j 完成其接水量要求wj 后,下一名排队等候接水的同学k马上接替j 同学的位置开始接水。这个换人的过程是瞬间完成的,且没有任何水的浪费。即j 同学第x 秒结束时完成接水,则k 同学第x+1 秒立刻开始接水。若当前接水人数n’不足m,则只有n’个龙头供水,其它m−n’个龙头关闭。
现在给出n 名同学的接水量,按照上述接水规则,问所有同学都接完水需要多少秒。
输入描述 Input Description
第1 行2 个整数n 和m,用一个空格隔开,分别表示接水人数和龙头个数。
第2 行n 个整数w1、w2、……、wn,每两个整数之间用一个空格隔开,wi 表示i 号同
学的接水量。
输出描述 Output Description
输出只有一行,1 个整数,表示接水所需的总时间。
样例输入 Sample Input
5 3
4 4 1 2 1
样例输出 Sample Output
4
数据范围及提示 Data Size & Hint
n<=10000, m<=100
第1 秒,3 人接水。第1 秒结束时,1、2、3 号同学每人的已接水量为1,3 号同学接完水,4 号同学接替3 号同学开始接水。
第2 秒,3 人接水。第2 秒结束时,1、2 号同学每人的已接水量为2,4 号同学的已接水量为1。
第3 秒,3 人接水。第3 秒结束时,1、2 号同学每人的已接水量为3,4 号同学的已接水量为2。4 号同学接完水,5 号同学接替4 号同学开始接水。
第4 秒,3 人接水。第4 秒结束时,1、2 号同学每人的已接水量为4,5 号同学的已接水量为1。1、2、5 号同学接完水,即所有人完成接水。
总接水时间为4 秒。
注意:初始顺序已经确定!!!!!!直接按照输入顺序来就可以,只不过不是求的最后一个进队时间,而是求的总时间,而堆顶*(-1)之后并不是最大的时间,要改为正数才可以,所以要全部pop出去,取最后一个数值
#include<algorithm>#include<queue>#include<cstdio>#include<algorithm>using namespace std;int n,m,a[1000010],t,ans=0;priority_queue <int> q;int main(){ freopen("water.in","r",stdin); //freopen("water.out","w",stdout); scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); } for(int i=1;i<=n;i++) { a[i]=-a[i]; if(q.size()<m) q.push(a[i]); else { t=q.top(); q.pop(); t+=a[i]; q.push(t); } } while(q.size()>0) { t=q.top()*(-1); q.pop(); ans=max(ans,t); } printf("%d\n",ans); return 0;}
3377
题目描述 Description
学校里有一个水房,水房里一共装有m个龙头可供同学们打开水,每个龙头每秒钟的供水量相等,均为1。
现在有n名同学准备接水,他们的初始接水顺序已经确定。将这些同学按接水顺序从 1到n编号,i号同学的接水量为wi。接水开始时,1到m号同学各占一个水龙头,并同时打开水龙头接水。当其中某名同学j完成其接水量要求wj后,下一名排队等候接水的同学k马上接替j同学的位置开始接水。这个换人的过程是瞬间完成的,且没有任何水的浪费。即j同学第x秒结束时完成接水,则k同学第x+1秒立刻开始接水。若当前接水人数n’不足m,则只有n’个龙头供水,其它m-n’个龙头关闭。
现在给出n名同学的接水量,按照上述接水规则,问所有同学都接完水需要多少秒。
特别地,同学们在打水前排好了队,接水所用时间更长的先接。
(ps:出题人本来想设计一个贪心的题目,然后发现用贪心做有反例,只能强改题目,在此声明道歉。不要在意样例解释。)
输入描述 Input Description
第 1 行2 个整数 n 和 m,用一个空格隔开,分别表示接水人数和龙头个数。
第 2 行 n 个整数 w1、w2、„„、wn,每两个整数之间用一个空格隔开,wi表示 i 号同学的接水量。
输出描述 Output Description
输出只有一行,1 个整数,表示接水所需的总时间。
样例输入 Sample Input
5 3
4 4 1 2 1
样例输出 Sample Output
4
数据范围及提示 Data Size & Hint
【输入输出解释】
第 1 秒,3 人接水。第 1秒结束时,1、2、3 号同学每人的已接水量为 1,3 号同学接完水,4 号同学接替 3 号同学开始接水。
第 2 秒,3 人接水。第 2 秒结束时,1、2 号同学每人的已接水量为 2,4 号同学的已接水量为 1。
第 3 秒,3 人接水。第 3 秒结束时,1、2 号同学每人的已接水量为 3,4 号同学的已接水量为 2。4号同学接完水,5 号同学接替 4 号同学开始接水。
第 4 秒,3 人接水。第 4 秒结束时,1、2 号同学每人的已接水量为 4,5 号同学的已接水量为 1。1、2、5 号同学接完水,即所有人完成接水。
【数据范围】
对于 30%的数据,n≤10,000,m≤1,000;
对于全部的数据,1≤m≤n≤1,000,000,1≤m≤100,000。
注意:排好了队是为了说明接水顺序是从大到小,而排序需要自己sort!!!!!!
#include<algorithm>#include<queue>#include<cstdio>#include<algorithm>using namespace std;int n,m,a[1000010],t,ans=0;priority_queue <int> q;int cmp(int x,int y){ return x>y;}int main(){ //freopen("water.in","r",stdin); //freopen("water.out","w",stdout); scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); } sort(a+1,a+n+1,cmp); for(int i=1;i<=n;i++) { a[i]=-a[i]; if(q.size()<m) q.push(a[i]); else { t=q.top(); q.pop(); t+=a[i]; q.push(t); } } while(q.size()>0) { t=q.top()*(-1); q.pop(); ans=max(ans,t); } printf("%d\n",ans); return 0;}
- codevs 3377 [Mz]接水问题2
- 【codevs 3377】[Mz]接水问题2
- Codevs 1127 接水问题&&3377 [Mz]接水问题2
- Codevs_P3377 [Mz]接水问题2(STL+优先队列)
- 【贪心】CODE[VS] 3377 [Mz]接水问题2 (模拟+优先队列(堆))
- 【codevs 1127】接水问题
- 【codevs 1127】接水问题
- Codevs 3377 接水问题2
- codevs天梯 装箱问题 水01背包
- CODEVS 4633 [Mz]树链剖分练习
- Codevs 4633 [Mz]树链剖分练习
- codevs天梯 3n+1问题 暴力水题
- Codevs-1081 线段树问题2
- Codevs 抄书问题1&2&3
- [codevs 1915] 分配问题
- [codevs 1914] 运输问题
- 【codevs】p1014 装箱问题
- Codevs 1014 装箱问题
- Linux系统下top命令详解
- Spark相关问题的故障排除
- 浅谈分布式服务协调技术 Zookeeper
- 独立增量过程
- gitup的使用
- Codevs 1127 接水问题&&3377 [Mz]接水问题2
- AlexNet--ImageNet Classification with Deep Convolutional Neural Networks
- 图标
- Vue之vuex的简单使用
- ∑-Δ 型ADC原理
- Windows配置本地域名
- Laravel 5.4 设置全局变量
- python 学习笔记
- 你听说过思维导图吗?