zoukankan      html  css  js  c++  java
  • CDOJ 1255 斓少摘苹果 图论 2016_5_14

    斓少摘苹果

    Time Limit: 3000/3000MS (Java/Others)     Memory Limit: 65535/65535KB (Java/Others)
     

    斓少家的院子里有N棵苹果树,每到秋天树上就会结出Fi个苹果。

    苹果成熟的时候,斓少就会跑去摘苹果。

    斓少摘苹果的方式非常的奇特,每次最多可以选择M个苹果并摘下来。

    但是摘下来的苹果两两一定不是来自同一棵树,问斓少最少摘多少次,才能使得每个苹果都被摘下来呢?

    Input

    第一行输入一个数NM1MN106),代表苹果树的数量,和斓少每次最多摘多少个。

    第二行输入N个数,第i个数Fi0Fi106)代表这一棵树上一共有多少个苹果

    Output

    输出一个数字,表示最少选择次数

    Sample input and output

    Sample Input Sample Output
    5 3
    3 2 3 2 4
    5

    Hint

    样例可以选 (1,3,5) (2,3,5) (1,4,5) (1,2,5) (3,4) 共5次

    Source

    第七届ACM趣味程序设计竞赛第二场(正式赛)
    题解:
    假设斓少每次都能取到m个苹果(不足m个时全取到),那么这个次数显然为Ti = (sigma(Fi)-1)/m + 1 
    由于对于每一天,每次都只能最多选这一棵树的一个果子,那么至少要取max(Fi)次
    现在,令Gi = max(max(Fi),Ti)
    现在证明是可以在Gi次取完的  ,Ti是下界。
    我们现在把模型转换成把N个宽度为1,长度分别的Gi,颜色为i的矩形。
    每个矩形拆分成Fi个1*1的矩形,填充至一个m*Gi的矩形内(可以不填满),满足在Gi行中,每一行都没有同样的颜色矩形
    我们从第一列,第一种颜色开始填充,每当这一列填满(即高度到达Gi)时填充下一列,如果该颜色用完就换下一种颜色。
    现在证明,这样可以保证每行都不会有同一种颜色。
    对于每一种颜色i,由于Gi>=max(Fi)>=Fi,那么任意一种颜色最多在相邻的两列中出现。
    如果只在一列中出现,显然都在不同一行。
    如果在相邻的两列,那么一列填充到了顶部,下列从最底部开始。设一列填充了ai个,下列填充了bi个,显然当且仅当ai+bi>Gi时才会出现在同一行的情况,但又有ai+bi=Fi<=max(Fi)<=Gi,所以也不会在同一行出现。
    于是我们证明,斓少可以在Gi次选完所有的果子。
    所以答案为 max( Ti , max(Fi) ),时间复杂度为O(N)
    1.注意本题向上取整的写法,还有(sum-1+m)/m!=(sum-1)/m+1因为sum==0时值

    便不同  !!!!,t对m向上取整(t-1+m)/m;
    <span style="font-size:24px;color:#3333ff;">#include <iostream>
    #include<cstdio>
    #include<queue>
    #include<algorithm>
    #include<cstring>
    #define inf 0x3f3f3f3f
    using namespace std;
    typedef long long ll;
    int  a[1000005];
    int main()
    {
        int n,m;
        while(~scanf("%d %d",&n,&m))
        {
             ll sum=0,f=0,maxn=0;
             for(int i=1;i<=n;i++)
            {
                scanf("%d",&a[i]);
                sum+=a[i];
                if(a[i]>maxn)
                maxn=a[i];
            }
            if(maxn>(sum-1+m)/m)
              f=maxn;
            else
               f=</span><span style="font-size:24px;color:#ff0000;">(sum-1+m)/m;</span><span style="font-size:24px;color:#3333ff;">
            printf("%lld
    ",f);
        }
        return 0;
    }</span><span style="color: rgb(51, 51, 51); font-size: 14px;">
    </span>

  • 相关阅读:
    vue项目使用async await 封装 axios
    vue实现预览功能(包括doc,pdf,图片,视频)
    vue中实现下载文件功能
    vue项目中加入拖放排序功能
    Vue项目中生成二维码
    position跟display、overflow、float这些特性相互叠加后会怎么样?
    localStorage使用注意
    webpack 使用总结
    cookie作用域
    语法糖的理解
  • 原文地址:https://www.cnblogs.com/smilesundream/p/6642548.html
Copyright © 2011-2022 走看看