您的位置:首页 > 其它

Hrbust2223水题

2016-03-28 21:14 232 查看
水题
Time Limit: 500 MSMemory Limit: 32768 K
Total Submit: 248(82 users)Total Accepted: 106(64 users)Rating:





Special Judge: No
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;

}

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: