题目描述
蕊蕊买了n罐糖,每罐糖中的数量不一,现在蕊蕊想吃掉至少m颗糖。蕊蕊想换着口味吃,因此蕊蕊将这些糖排成一排,一轮一轮吃。每一轮蕊蕊从每一罐中拿出一颗糖吃掉,若吃到某罐糖时这罐糖已经空了,那么蕊蕊就会跳过这罐糖。请问蕊蕊至少要吃多少轮才能吃够m颗糖?
- 输入
第一行输入两个整数n(0
由于输入数据很多,如果你使用了cin 或 cout ,请在main函数的第一行加上 std::ios::sync_with_stdio(false); 关闭同步加快数据读入。
- 输出
输出一个整数,表示蕊蕊至少要吃多少轮才能吃够m颗糖。
- 输入样例
10 16
2 7 4 5 4 4 1 3 3 10
- 输出样例
2
1e15显然需要long long了。每一次蕊蕊取糖的规则是唯一确定的,因此每一轮吃的也是固定的。
因此解实际上是固定边界的,二分查找这个最小的解即可,使用简陋的代码即可AC:
#include <iostream>
using namespace std;
int C[1000000];
int main()
{
std::ios::sync_with_stdio(false);
long long N, n = 0, i = 0, j = 0, m = 0, count = 0;
long long f, max, min;
long long M;
cin >> N;
cin >> M;
max = M;
while (n < N)
{
cin >> C[n];
n++;
}
min = M/N+1;
f = (max + min) / 2;
n = 0;
while (n < N)
{
if (C[n] >= f)
count += f;
else
count += C[n];
n++;
}
while (count > M || M - count > N)
{//二分查找最小边界解,这个解可能差一点不可行
if (count < M)
min = f + 1;
else
max = f - 1;
f = (max + min) / 2;
count = 0;
n = 0;
while (n < N)
{
if (C[n] >= f)
count += f;
else
count += C[n];
n++;
}
}//如果二分的解还不可行,再多吃一轮
while (count < M)
{
f++;
count = 0;
n = 0;
while (n < N)
{
if (C[n] >= f)
count += f;
else
count += C[n];
n++;
}
}
cout<<f;
}