Description
鸡国中的母鸡最擅长下蛋了,MGMG 是鸡国中一只以下蛋产量高而闻名全鸡国的母鸡。
鸡国专供下蛋的 n 个鸡窝呈一字排列在鸡国的“下蛋中心”,从左到右依次编号为 1 到n。每个鸡窝都有一个最大可下蛋的量,其中第 i 个鸡窝的最大可下蛋量为 ci。有时候由于MGMG 产量实在太大而无法在一个鸡窝中下完所有的蛋,不得不转移到隔壁的鸡窝继续下蛋,如果隔壁的鸡窝还是不能让它下完所有的蛋,则 MGMG 继续转移,直到下完所有的蛋, 或者向“下蛋中心”管理员投诉“鸡窝数量实在太少了,我一只鸡的下蛋量都装不下!”。
为了节省转移时所耗费的体力,请你编程帮助 MGMG 找若干个连续的鸡窝(个数尽量少),让它能下完所有的蛋。
Input
输入共 2 行。
第 1 行输入两个整数 n 和 t,表示“下蛋中心”有 n 个可供下蛋的鸡窝,MGMG 一次总共要下 t 个鸡蛋。
第 2 行 n 个正整数 ci(1≤i≤n),依次表示第 i 个鸡窝最大可下蛋量为 ci 个。
Output
输出 1 行,一个整数或一个单词。当输出整数时表示让 MGMG 下完所有的蛋至少需要几个连续的鸡窝。当 MGMG 用完所有的鸡窝都无法下完所有的蛋时,MGMG 表示非常愤怒, 输出单词“Angry”(不包含双引号,注意大小写)。
Sample Input
【输入样例1】
5 4
1 2 1 2 3
【输入样例2】
3 9
3 3 3
【输入样例3】
3 5
1 2 1
Sample Output
【输出样例1】
2
【输出样例2】
3
【输出样例3】
Angry
HINT
【样例 1 解释】
样例 1 中,有 5 个鸡窝,可下蛋量分别为 1,2,1,2,3。MGMG 如果选择第 1,2,3 号鸡窝能下完 4 个蛋,但要用 3 个鸡窝,而选择第 4 号和第 5 号鸡窝也能下完 4 个蛋(还有1 个多余的容量),但用到的鸡窝只有 2 个。
注意:由于第 2 号和第 4 号鸡窝不连续,不可以作为选择的方案之一。
【样例 2 解释】
样例 2 中,有 3 个鸡窝,可下蛋量分别为 3,3,3,MGMG 可以在这 3 个连续的鸡窝中每个下 3 个蛋,这样正好总共下 9 个蛋。
【样例 3 解释】
样例 3 中,所有鸡窝的可下蛋总量小于 MGMG 的下蛋量,无法满足 MGMG 的下蛋需求,,输出“Angry”。
【数据范围】:1≤n≤106 1≤t≤108 1≤ci≤10000
二分出奇迹
#include <iostream>
#define SIZE 1000010
using namespace std;
int a[SIZE], n, t;
bool check(int x) // 检查函数
{
int i, tot = 0;
for (i = 1; i <= x; ++i)
{
tot += a[i];
}
if (tot >= t)
{
return true;
}
for (i = x + 1; i <= n; ++i)
{
tot += a[i];
tot -= a[i-x];
if (tot >= t) // 下的完,可以
{
return true;
}
}
return false;
}
int main(void)
{
int i, l = 1, r = 0, mid, res;
scanf("%d%d", &n, &t);
for (i = 1; i <= n; ++i)
{
scanf("%d", &a[i]);
r += a[i];
}
if (r < t) // 用尽所有的也不行,无解
{
printf("Angry");
return 0;
}
r = n;
while (l <= r) // 二分框架
{
mid = (l + r) >> 1;
if (check(mid))
{
res = mid;
r = mid - 1;
}
else
{
l = mid + 1;
}
}
printf("%d", res);
return 0;
}