题意:
要做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#include #include #include 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;}