Hrbust2223水题
2016-03-28 21:14
232 查看
水题 | ||||||
| ||||||
Description | ||||||
因为是有关于接水的问题,便简称为水题了(。 N个人排队在M个出水口前接水,第i个人接水需时为t[i], 请问接水的最短用时是多少? | ||||||
Input | ||||||
第一行一个整数 T ,代表有 T 组数据。 每组数据 第一行两个整数 N(<=100000) , M(<=10000) 代表有 N 个人 M 个出水口。 第二行N个整数,第i个数字t[i](<=10000)代表第i个人接水用时t[i]。 | ||||||
Output | ||||||
对于每组数据输出一个整数,代表所需的最少接水时间。 | ||||||
Sample Input | ||||||
2 5 3 1 2 3 4 5 6 3 1 2 3 3 4 5 | ||||||
Sample Output | ||||||
5 6 题解: 排队节水,尽量让接水时间长的先接(如果时间短的先接,最后会出现只有几个水龙头为时间长的工作,而其他的水龙头闲着了)就是说,要尽量让水龙头一起工作,尽可能避免水龙头长时间闲着。这样我们就需要将接水的时间按从大到小排列,而水龙头的工作时间是从小到大。这里我们就需要用到优先队列。 #include <stdio.h> #include <stdlib.h> #include <queue> using namespace std; int main() { int t,n,i,m; int a; scanf("%d",&t); while(t--) { priority_queue<int, vector<int>, greater<int> >xiao; priority_queue<int, vector<int>, less<int> >da; scanf("%d%d",&n,&m); for(i=0;i<n;i++) { scanf("%d",&a); da.push(a); } for(i=0;i<m;i++) xiao.push(0); while(!da.empty()) { a=xiao.top();//模拟接水过程 xiao.pop(); a=a+da.top(); da.pop(); xiao.push(a); } while(!xiao.empty()) { a=xiao.top(); xiao.pop();//找到最后一个水龙头关闭的所用的时间 } printf("%d\n",a); } return 0; } |
相关文章推荐
- java static 归纳
- 今天集训队走了4个人--我的心好像流泪了
- poj 3616 Milking Time 动态规划
- java事务学习笔记(九)--深度剖析JTA原理与实现
- 数据库高效编程(mysql)
- bzoj1208 [HNOI2004]宠物收养所 splay入门
- java split小结(转)
- EXTJS之DATA PROXY READER
- 【Data Algorithms_Recipes for Scaling up with Hadoop and Spark】Chapter 10 Content-Based Recommend
- 设计模式-策略模式
- Bootstrap的基本使用方法,5分钟帮你搞懂怎么用
- OpenGL学习(二) 状态管理和绘制几何物体
- JVM内存原理,weblogic内存的调优
- 关于Java-枚举的总结
- j2ee ehcache
- Hibernate_core_method
- PyCharm快捷键
- droid中EventBus使用详解(二)
- batch insert 1 million datas into mysql
- [LeetCode]题解(python):131-Palindrome Partitioning