c语言尺取算法-

尺取法:尺取法通常是对数组保存一对下标,即所选取的区间的左右端点,然后根据实际情况不断地推进区间左右端点以得出答案。它就跟毛毛虫一样一步步往前取,但每次都会把两端点变小,之所以需要掌握这个技巧,是因为尺取法比直接暴力枚举区间效率高很多,尤其是数据量大的

时候,所以尺取法是一种高效的枚举区间的方法,一般用于求取有一定限制的区间个数或最短的区间等等。当然任何技巧都存在其不足的地方,有些情况下尺取法不可行,无法得出正确答案。
当我们确定可以使用尺取法后,我们要正确的去分析。
我们不喽嗖了,来举个栗子:
给出了N个正整数(10<N<100000)的序列,每个正整数小于或等于10000,以及一个正整数S(S<100000 000)。编写一个程序,找出序列中连续元素的子序列的最小长度,其和大于或等于S。

输入

第一行是测试用例的数量。对于每个测试用例,程序必须从第一行读取数字N和S,用间隔隔开。序列号在测试用例的第二行给出,用间隔隔开。输入将在文件结束时结束。

输出

对于每种情况,程序必须在输出文件的单独行上打印结果。如果没有答案,则打印0。
10 15
7 1 2 6 8 9 4 5 10 3
实现待码如下:
#include<stdio.h>
#include<string.h>
typedef long long ll;
int main()
{
ll min(ll x,ll y);
ll t=0,sum=0,c=0,s,n;
ll a[100010]={0};
scanf("%lld%lld",&n,&s);
for(int i=0;i<n;i++)
{
scanf("%lld",&a[i]);
}
ll b=n+1;
for(;😉
{
while(t<n&&sum<s)
{
sum+=a[t++];
}
if(sum<s)
break;
b=min(b,t-c);
sum-=a[c];
c++;

}
if(b>n)
    b=0;
printf("%lld\n",b);

return 0;

}
ll min(ll x,ll y)
{
return(x<y?x:y);
}
需要注意的是中间的循环部分,你要如何让循环结束。
上面while循环是控制尾点,当sum>s或t>n时跳出循环。if(t>n&&sum<s)的话就是这些数之和都小于s,此时输出0。当t<n但sum>s是执行后面的语句,c就是用来标记前面的端点的,再一次次循环中把两端点推进,直到sum<s,break掉,出循环,然后输出。还不懂的话拿出你的笔在草稿本上罗列一下,相信你马上就会了,,理解的思维,代码就很简单了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值