ZOJ3778 Talented Chef(贪心)
题意:
要做n道菜,每道菜有a[i]个步骤,厨师每次可以操作m个步骤,求最小需要几次把菜做完。
要点:
就是小学搞过的摊饼问题,一个饼要几分钟这样。可以这样思考:如果m>=n,那肯定就是所有a[i]中的最大值max作为结果。如果m<n,那我们先求ans=sum/m,也就是平均值,结果只会比这个值大而不会比这个值更小了,如果sum%m==0,说明最后一次也能同时操作m个菜,ans=sum/m,否则说明最后一次还剩下一些为1的(中间无论怎么操作最后肯定使其他的可以剩下1,仔细想想就可以看出来),ans=sum/m+1。得到ans后与max比较,如果ans<max,那不可能通过ans次操作使max为0,结果为max,反之为ans。
贪心思想:贪心的将每一分钟的操作都不浪费的去做菜就能达到最贪心的点,也就是最小消耗。那么这个时候的最小消耗就是:sum/m(如果是整除)sum/m+1(如果是不整除)。
参考博客:点击打开链接
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include<algorithm>
using namespace std;
int main()
{
int t,n,m;
int a[40005];
scanf("%d", &t);
while (t--)
{
scanf("%d%d", &n, &m);
int sum = 0;
int maxx = -1;
for (int i = 0; i < n; i++)
{
scanf("%d", &a[i]);
sum += a[i];
maxx = max(maxx, a[i]);
}
int ans; //贪心思想,充分利用每次操作能达到最小的操作数
if (sum%m == 0)
ans = sum / m;
else
ans = sum / m + 1; //不能整除说明最后还剩一些需要再一步操作
ans = max(maxx, ans); //如果贪心不能达到最大值,那结果就是最大值,反之说明贪心成立
printf("%d\n", ans);
}
return 0;
}