温馨提示:还没预习的小伙伴请到【算法】尺取法——学霸小羊先预习一下。
接上集……
(肯定有一部分小伙伴会直接跳过上集,所以先重温一下题目吧)
题目描述
大森林有熊兄弟的好朋友松鼠蹦蹦,一天蹦蹦来到一条很长的小 路,发现沿路地上都有松果,高兴极了,决定尽可能多吃松果。
蹦蹦观察到,每个松果的重量并不一定相同,可蹦蹦的肚子容量 有限,总共最多只能吃重量 C 的松果。
蹦蹦吃东西有个特点,一旦开吃就会不停的吃,不会漏过路上碰 到松果,直到遇到一个吃不下或吃完停止。也就是说松鼠蹦蹦只会吃 连续一段的松果。
已知路上共有 N 个松果,顺序的重量是 w_1, w_2,..., w_nw1,w2,...,wn 。蹦蹦最多可能吃多少颗松果?
输入格式
第一行,二个正整数,空格分开,表示 N 和 C,N 范围在[1..50000], C 范围在[1..1000000]。
第二行,N 个正整数,空格分开,表示从 w_1、w_2,..., w_nw1、w2,...,wn ,即松果的重量。每个松果重 量范围在[1..1000]。
数据范围
一个正整数,蹦蹦可以吃到的最多松果数量。
输出格式
样例
输入数据 1
5 5
3 1 2 1 1
输出数据 1
4
输入数据 2
9 5
1 5 4 3 2 1 1 4 1
输出数据 2
3
样例解释
样例 1 :吃:(1,2,1,1)这段的松果。
样例 2 :吃:(2,1,1)这段的松果。
那么,步入正题!
直接给上一个程序填空!!
走起!!!
#include<bits/stdc++.h>
using namespace std;
int n,c,a[50002],ma=0,s=0;
long long ans;
int main()
{
cin>>n>>c;
for(int i=1;i<=n;i++) cin>>a[i];
for(int x=1,y=填空(1);y<=n;y++)
{
s += 填空(2); // x 到 y 的松果总重量
填空(3) (s>c) s-= a[x++]; //移动 x 收缩区间
ma=max(填空(4),ma); //求最长区间长度
}
cout<<ma;
return 0;
}
第一个问题:你做出来了吗?
第二个问题:你发现不一样了吗?
答案:
(请不要直接看答案!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!)
(1): 1
(2): a[y]
(3): while
(4): y-x+1
这题与原来的区别在于,原来是符合条件就更新答案并收缩,这道题是不符合条件就收缩,收缩完再更新。造成这样不同的原因很简单:之前是求最小的,现在是求最大的。
好啦,今天就讲到这了,拜拜!