2021牛客多校第六场F题

题意:给n个汉堡,m个锅,给出每个汉堡需要煎的时间ti。一个汉堡排可以在一口锅中煎好,也可以分成两次在两口锅里煎好。一口锅同时只能煎一个汉堡排,一个汉堡排同时只能放到一个锅里。求一个方案使煎好所有的汉堡排所需要的时间最少(尽早煎完)。

 

心路历程:

这道题首先想到先排个序,把大的先依次放入

再想到二分枚举最少时间

后来听了题解恍然大悟,就用个公式就行

最少用时T=max(ti,[\sum ti/m])

还二分?都不用排序好吧,知道T之后直接写就完事了

(怪不得是签到题TAT)

就不断地向锅中煎汉堡,如果超过了就换到下一口锅继续煎

至于考虑放在两口锅煎会不会出现重叠,根本不可能,本来T就是比最大ti不小的,如果出现重叠不就说明这个汉堡排的时间比T要大了,矛盾

ps:我不知道是我的问题还是什么原因,在输出两口锅的情况时,要先输出未装满锅的情况,在输出装满锅的情况,反过来就过不了(比如样例2 2 0 1 1 3 5是正确的,2 1 3 5 2 0 1就是错的)

代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 100010;
ll a[N];

int main()
{
	int n, m;
	cin >> n >> m;
	ll sum = 0, t = 0;
	for (int i = 1; i <= n; i++)
	{
		cin >> a[i];
		sum += a[i];
		t = max(t, a[i]);
	}
	if (sum % m == 0)
	{
		t = max(t, sum / m);
	}
	else
	{
		t = max(t, sum / m + 1);//还是需要+1的
	}
	ll now = 0;
	int k = 1;
	for (int i = 1; i <= n; i++)
	{
		if (t - now > a[i])
		{
			cout << "1 "<<k<<' '<< now << ' ';
			now += a[i];
			cout << now << endl;
		}
		else if (t - now == a[i])
		{
			cout << "1 "<<k<<' ' << now << ' ' << t << endl;
			now = 0;
			k++;
		} 
		else
		{
			cout << "2 " << k+1 <<" 0 " << a[i] -(t - now) << ' ' << k << ' '<<now<<' '<<t<<endl;//就是这里!!!坑死我了,wa了好几次
			now = a[i] - (t - now);
			k++;
		}
	}
	return 0;
}

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值