【ZOJ3778】【C++心路历程40】【厨师】【贪心】【思路题】

哈哈本来是一道考试题,被发现了之后感觉多有趣的~
【问题描述】

  中秋佳节,xxx家亲朋好友欢聚一堂。作为兼职厨师,xxx需要为大家做n道菜。
  已知道第i道菜有xi个工序,xxx每分钟可同时做m道菜的一个工序。
  现在请你帮xxx计算完成n到菜的最短时间。

【输入格式】

  输入的第1行为整数n和m,它们的意义如题目描述。第2行有n个整数,第i个整数为xi,表示第i道菜的工序数目。

【输出格式】

  输出一个整数,表示完成n道菜的最短时间。

【输入样例】

【样例1】
 3 2
 2 2 2

【样例1】
 10 6
 1 2 3 4 5 6 7 8 9 10

【输出样例】

【样例1】
 3

【样例2】
 10

【样例解释】

【样例1说明】
  第1分钟同时完成第1道第2到菜的第1个工序,那么3道菜剩下的工序分别为1 1 2。
  第2分钟完成第1道菜的第2个工序,同时完成第3道菜的第1个工序,那么3道菜剩下的工序分别为0 1 1。
  第3分钟完成第2道菜和第3道菜的第2个工序,那么3道菜剩下的工序分别为0 0 0。
【数据范围】
1 <= n, m <= 40000
1 <= xi <= 40000。
这个题比较明显的思路是从大到小排序,但是排序之后该做什么> <
不难发现,最大时间那一道菜和答案密切相关。
比如当m>=n时,总时间显然是做最大那一道菜的时间。
那么小于呢?
考虑最优情况,ans不会小于sum/m这个值。设最大的那一盘时间为Max。

如果Max小于(csdn小于打不起?????)sum/m,故所有的菜时间都小于sum/m。那么在sum/m(向上取整)的时间内一定能把所有菜做完(贪心思想)。

如果Max>=sum/m,那么答案就是Max。
简证如下:
因为sum/m小于Max
所以 sum小于Max*m
有 (sum-Max)/(m-1)小于Max (*)
(*)式说明了什么?说明了每次做除了带着Max做之外,剩下的菜已经被划分成了一个子问题,即每分钟能做(m-1)个菜,并且这(m-1)个菜一定可以在Max的时间内做完。
所以总时间不会超过Max。
事实上,自己证明的时候其实先想到了(*)式,再去推了他的正确性(在http://blog.csdn.net/xiaoming_p 帮助下)因为这个结论很是能划归到子问题!

然而,对于Max小于sum/m情况的证明,确实想不到什么好方法,暂且放在这里吧。但是,能感觉出来,满足了这个条件,一定是对的….也许,这就是贪心的魅力所在吧。


#include<cstdio>
#include<iostream>
#include<cmath>
#include<algorithm>
#include<vector>
#include<cstring>
using namespace std;
const int maxn=40005;
const int maxm=10005;
int n,m,a[maxn],sum=0,mx=0;
void init()
{
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&a[i]);
        sum+=a[i];mx=max(mx,a[i]);
    }
    if(m>=n) printf("%d",mx);
    else
    {
        int tt=sum/m;
        if(tt>mx)
        {
            if(sum%m) tt++;
            printf("%d",tt);
        }
        else
            printf("%d",mx);
    }
}

int main()
{
//  freopen("in.txt","r",stdin);
    init();


    return 0;
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值