UPC 1773 接水问题(priority_queue 优先队列)

问题 F: 接水问题

时间限制: 1 Sec   内存限制: 128 MB
提交: 276   解决: 107
[ 提交][ 状态][ 讨论版][命题人: admin]

题目描述

学校里有一个水房,水房里一共装有m个龙头可供同学们打开水,每个龙头每秒钟的供水量相等,均为1。

现在有n名同学准备接水,他们的初始接水顺序已经确定。将这些同学按接水顺序从1到n编号,i号同学的接水量为wi。接水开始时,1到m号同学各占一个水龙头,并同时打开水龙头接水。当其中某名同学j完成其接水量要求wj后,下一名排队等候接水的同学k马上接替j同学的位置开始接水。这个换人的过程是瞬间完成的,且没有任何水的浪费。即j同学第x秒结束时完成接水,则k同学第x+1秒立刻开始接水。若当前接水人数n’不足m,则只有n’个龙头供水,其它m−n’个龙头关闭。

现在给出n名同学的接水量,按照上述接水规则,问所有同学都接完水需要多少秒。

输入

第1行2个整数n和m,用一个空格隔开,分别表示接水人数和龙头个数。
第2行n个整数w1、w2、……、wn,每两个整数之间用一个空格隔开,wi表示i号同学的接水量。
1≤n≤10000,1≤m≤100且m≤n;1≤wi≤100。

输出

输出只有一行,1个整数,表示接水所需的总时间。

样例输入

5 3 
4 4 1 2 1

样例输出

4

提示

第1秒,3人接水。第1秒结束时,1、2、3号同学每人的已接水量为1,3号同学接完水,4号同学接替3号同学开始接水。
第2秒,3人接水。第2秒结束时,1、2号同学每人的已接水量为2,4号同学的已接水量为1。
第3秒,3人接水。第3秒结束时,1、2号同学每人的已接水量为3,4号同学的已接水量为2。4号同学接完水,5号同学接替4号同学开始接水。
第4秒,3人接水。第4秒结束时,1、2号同学每人的已接水量为4,5号同学的已接水量为1。1、2、5号同学接完水,即所有人完成接水。
总接水时间为4秒。



#include <cstdio>
#include <iostream>
#include <cstring>
#include <queue>
#include <vector>
using namespace std;

int main()
{
    int n, m;
    while(cin >> n >> m)
    {
        priority_queue<int, vector<int>, greater<int> >a;
        for(int i=1; i<=n; i++)
        {
            int t, j;
            cin >> t;
            if(i <= m)
                a.push(t);
            else
            {
                j = a.top();
                a.pop();
                a.push(j+t);
            }
        }
        for(int i=1; i<m; i++)
            a.pop();
        cout << a.top() << endl;
    }
}
/**
8 4
4 3 6 5 2 7 8 4
*/

猜你喜欢

转载自blog.csdn.net/a_thinking_reed_/article/details/79682843