UESTC 1255 斓少摘苹果 贪心法

斓少摘苹果

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

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

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

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

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

Input

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

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

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趣味程序设计竞赛第二场(正式赛) C


My Solution

第一想法是模拟,应该超时

只有最后一次可能是不到m个苹果
其它时候都是每次m个
所以总数sum,次数可能为(sum-1)/m+1  这样的话如果搞好sum%m==0,也符合公式,      把它分开来讨论也可以
且一颗树最多maxx个苹果,所以最少要maxx次
则答案是max(maxx , (sum-1)/m+1)

此外注意这句话
第二行输入 N 个数,第 i 个数 Fi 0Fi106    )代表这一棵树上一共有多少个苹果
自从Flying Chess 的题目被坑了以后,临界值是格外的注意啊,这里Fi全部为0的时候是特殊的情况,且可以出现,次数答案为 0

#include <iostream>
#include <cstdio>
#include <algorithm>
#define LOCAL
using namespace std;

int main()
{
    #ifdef LOCAL
    freopen("a.txt","r",stdin);
    #endif // LOCAL
    int N,M;
    long long sum=0,maxx=0,a;
    scanf("%d%d",&N,&M);
    while(N--){
        scanf("%lld",&a);
        sum+=a;
        maxx=max(a,maxx);
    }
    if(sum==0) printf("0");
    else printf("%lld",max(maxx,(sum-1)/M+1));
    return 0;
}

谢谢

你可能感兴趣的:(ACM,ICPC,区间,OJ,uestc,总结公式)