题目链接: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;
}