题目链接:http://acm.zzuli.edu.cn/problem.php?id=2488
时间限制: 1 Sec  内存限制: 128 MB

题目描述

快要到期末了,pht在这两天好忙啊。经过几个小时的奋战,他终于把实验报告写完了,但是他因此错过了午饭时间,pht觉得自己好饿。
这时他发现在旁边xcp的位置上有好多零食,pht决定偷偷的拿一点他的零食吃
一共有n种零食,每种零食有ai袋
为了使xcp不容易发现自己偷吃了,pht应让自己在吃完后,使每个种类的零食剩下的尽量多,也就是说在挑选零食吃时,应考虑在挑选完后剩下袋数最少的零食的数量尽可能大

输入

第一行输入 n(1<=n<=100000)和m(m<=1e12)
m代表pht想吃多少袋零食
第二行输入n个数ai(1<=ai<=1e9) ,表示每种零食的数量。

输出

输出最优情况下的最小袋数,如果pht不能吃饱,输出-1,输出单独占一行

样例输入

3 3
5 3 4
3 4
5 3 4
3 13
5 3 4

样例输出

3
2
-1

提示

Case1:选取第一种两袋与第三种一袋,最少袋数为3
Case2:选取第一种三袋与第三种一袋,最少袋数为2

解题思路

我们要想最小的最大,那么我们应该首先把那些比最小的多的那些先吃了,因为先吃大的对结果没什么影响,当比最小的多的那些不够的时候再从最小的往下吃。

#include <stdio.h>
long long sum, m, ans, minn, a;
int main()
{
    int n;
    while (~scanf("%d%lld", &n, &m))
    {
        sum = 0;
        minn = 1e9;
        for (int i = 0; i < n; i++)
        {
            scanf("%lld", &a);
            sum += a;
            if (a < minn)
                minn = a;
        }
        if (sum >= m)
        {
            ans = sum - n * minn;
            if (m -  ans < 0)
                ans = m;
            minn -= ((m - ans) / n) + !!((m - ans) % n);
            printf("%lld\n", minn);
        }
        else printf("-1\n");
    }
    return 0;
}