机试:接啤酒

题目描述

酒馆里有m个龙头可供顾客们接啤酒,每个龙头每秒的出酒量相等,都是1。现有n名顾客准备接酒,他们初始的接酒顺序已经确定。将这些顾客按接酒顺序从1到n编号,i号顾客的接酒量为w_i。接酒开始时,1到m号顾客各占一个酒龙头,并同时打开龙头接酒。当其中某个顾客j完成其接酒量要求wj后,下一名排队等候接酒的顾客k马上接替j顾客的位置开始接酒。这个换人的过程是瞬间完成的,且没有任何酒的浪费。即j顾客第x秒结束时完成接酒,则k顾客第x+1秒立刻开始接酒。若当前接酒人数n’不足m,则只有n’个龙头供酒,其它m-n’个龙头关闭。现在给出n名顾客的接酒量,按照上述规则,问所有顾客都接完酒需要多少秒?

输入描述:

输入包括两行,第一行为以空格分割的两个数n和m,分别表示接酒的人数和酒龙头个数,均为正整数。

第二行n个整数w_i(1 <= w_i <= 100)表示每个顾客接酒量输出描述:

如果输入合法输出酒所需总时间(秒)。

注意:最终交付的函数代码中不要向控制台打印输出任何无关信息。

示例1

输入

5 3

4 4 1 2 1

输出

4

不知道有没有问题,欢迎指正

#include<iostream>
#include<vector>
using namespace std;

bool cmp(int a, int b)
{
	return a > b;
}
int main()
{
	int n, m;                //接酒的人数和水龙头数,水龙头出酒速度为1
	while (cin >> n >> m)
	{
		vector<int>cap(n);
		int temp;
		for (int i = 0; i < n; i++)
		{
			cin >> temp;
			cap[i] = temp;                 //记录酒量
		}
		sort(cap.begin(), cap.end(),cmp);     //顺序无所谓可以直接排序,这里从大到小
		if (n <= m)                      //如果喝酒的人数少于水龙头数量
		{
			cout << cap.front() << endl;
			break;
		}

		vector<int>lo(cap.begin(),cap.begin()+m);
        

		sort(lo.begin(), lo.end());
		for (int i = m; i < n; i++)
		{
			lo[0] += cap[i];
			sort(lo.begin(), lo.end());
		}
		sort(lo.begin(), lo.end());
		cout << lo.back() << endl;

	}
	return 0;
}


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值