ZOJ3778 Talented Chef(贪心)

来源:互联网 发布:苍南哪有淘宝培训 编辑:程序博客网 时间:2024/05/17 02:35

题意:

要做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;elseans = sum / m + 1;//不能整除说明最后还剩一些需要再一步操作ans = max(maxx, ans);//如果贪心不能达到最大值,那结果就是最大值,反之说明贪心成立printf("%d\n", ans);}return 0;}


0 0