hrbust 2223 水题

水题
Time Limit: 500 MSMemory Limit: 32768 K
Total Submit: 321(108 users)Total Accepted: 133(83 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

Hint
小桥流水哗啦啦,我和小岛去偷瓜~
Source
"诚德软件杯"哈尔滨理工大学第四届ACM程序设计团队赛
首先我们应该知道,要使接水的总时间最少,n个人当中用时最多的前m个人要分别占用不同的水龙头,这很好理解,因为m<n,所以肯定有至少两个人要用同一个水龙头来接水,那么这个水龙头所用的接水时间是这些时间的加和,如果这里面存在用时最长的前m个人中的一个的话,那么最后的用时肯定不是最优解。这样就好办了,我们先把n个人的接水时间按降序,然后定义一个s()数组来存放每一个水龙头所用的接水时间,并用排好序的前m个人的接水时间来初始化s()数组,对于从m+1开始的往后的每一个人,只需把他的接水时间加到s()数组里面最小的时间上,然后找出s()数组的最大值,即为n个人用m个水龙头接水所用的最短时间。

优先队列练习

#include<iostream>
#include<algorithm>
#include<queue>
#include<vector>
using namespace std;
struct cmp
{
    bool operator ()(int a,int b)
    {
        return a>b;
    }
};
bool cmp1(int a,int b)
{
    return a>b;
}
int num[1000003];
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int n,m;
        priority_queue<int,vector<int>,cmp>q;
        cin>>n>>m;
        for(int i=1; i<=m; i++)
        {
            q.push(0);
        }


        for(int i=1; i<=n; i++)
        {
            cin>>num[i];
        }
        sort(num+1,num+n+1,cmp1);
        for(int i=1; i<=n; i++)
        {
            int f=q.top();
            f+=num[i];
            q.pop();
            q.push(f);
        }
        int ans=-1;
        while(!q.empty())
        {
            if(q.top()>ans)
                ans=q.top();
            q.pop();
        }
        cout<<ans<<endl;
    }
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值