BOJ 1020 信息战(六)——军队体检

题目链接~~>

解题思路:m个军医所用的时间等价于治疗病人最多的那个军医所花费的时间。先按人数排序,然后把前m大的排压入优先队列,每次出队的是先体检完的军医,队列里的最后一个元素就是体检人数最多的军医体检的人数,然后除以每个军医每天体检的人数即可求出答案。

代码:

#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
int a[1000005];
bool comp(int x, int y)
{
    return x > y;
}
int main()
{
    int t, n, m, p, i;
    //值小的优先出队,因为值小治病的时间短
    priority_queue<int, vector<int>, greater<int> > Q; 
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d%d",&n,&m,&p);
        while(!Q.empty())
            Q.pop();
        for(i = 0; i < n; i++)
            scanf("%d",&a[i]);
        sort(a, a+n, comp); //从大到小排序
        for(i = 0; i < m; i++)
            Q.push(a[i]); //把m个最大的压入优先队列
        for(i = m; i < n; i++)
        {
            int tmp = Q.top();
            Q.pop();
            tmp += a[i]; 
            Q.push(tmp);
        }
        while(Q.size() > 1) //最后一个一定是最大的,即治疗病人最多的军医治疗的人数
            Q.pop();
        printf("%.3lf\n",Q.top()*1.0/p);
    }
    return 0;
}

转自~~

你可能感兴趣的:(BOJ 1020 信息战(六)——军队体检)