【算法】尺取法——变式

发布于:2024-12-22 ⋅ 阅读:(14) ⋅ 点赞:(0)

温馨提示:还没预习的小伙伴请到【算法】尺取法——学霸小羊先预习一下。

接上集……

(肯定有一部分小伙伴会直接跳过上集,所以先重温一下题目吧)

题目描述

大森林有熊兄弟的好朋友松鼠蹦蹦,一天蹦蹦来到一条很长的小 路,发现沿路地上都有松果,高兴极了,决定尽可能多吃松果。

蹦蹦观察到,每个松果的重量并不一定相同,可蹦蹦的肚子容量 有限,总共最多只能吃重量 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

这题与原来的区别在于,原来是符合条件就更新答案并收缩,这道题是不符合条件就收缩,收缩完再更新。造成这样不同的原因很简单:之前是求最小的,现在是求最大的。

好啦,今天就讲到这了,拜拜!