贪心(ZOJ 3778,Talented Chef)

来源:互联网 发布:python 多线程 返回值 编辑:程序博客网 时间:2024/05/18 02:12
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3778


给你n道菜,第i道菜需要a[i]步才能完成,厨师每次最多可以取m道不同的菜,各完成1步,问最少要多少次才能完成。


答案:

设a=max(a[i]),1<=i<=n。即完成某道菜最多需要的步数。

b=((∑a[i])-1)/m+1。步数和除以m,向上取整。

答案就是max(a,b)。


证明:

如果除了最后一次,每次都能取m道不同的菜,那答案就是b。

否则,肯定存在某一次,剩下的菜少于m道,而且不能一次完成。

因为菜与菜之间唯一的区别就是剩下的步数,所以我们每次取剩下的步数最多的m道菜来制作一定是最优解。

如果哪怕是这样做,依然遇上了没菜做的情况,那么说明我们之前每次肯定都取了最多步数的那道菜。更重要的是我们以后也依然会是这样,所以答案就是a。

因为答案必是a,b之一而且两者又刚好都是一个下限,所以取最大值就是最终答案。


思路:

ACM这种东西以AC为准,就算不能给出严格证明,也可以猜一猜。

0 0
原创粉丝点击