水题 | ||||||
| ||||||
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 这道题用到了优先队列来作为解决方法。优先队列不是一般的先进先出的队列,而是按照优先级删除的队列。 优先队列0或多个元素的集合,首先要有头文件queue。 本题的话只要把m个分别计算时间最长的,将所有人从大到小排序,依次插入M个出水口, 每次插入到用时最小的出水口,最后输出M个出水口中用时最多的那一个。 #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;
}
|
哈理工oj2223
最新推荐文章于 2018-04-25 18:22:48 发布