UVaLive 2678(LA)Subsequence SEERC 2006 题解

来源:互联网 发布:手机上怎么找淘宝链接 编辑:程序博客网 时间:2024/05/16 14:27

UVa传送门


Vjudge传送门


题意:

这道题是要在一个由n个正整数组成的一个序列里面求一个长度对钻的连续序列使其和大于等于一个给定的整数S10<s<=100000,S<1e9


题解:

显然我们发现,如果现在已经有满足的序列使其大于等于这个给定的数S了,比如说是下标为i>j的序列,那么显然如果我们的j指针++i>j+1的和一定也大于S,所以显然我们对于所有满足的子序列,j在增加的时候i也是增加的,故序列的左端点i具有单调性,所以我们只需要维护他一直往后走就可以了。


代码:

#include<cstdio>#include<cstring>#include<iostream>using namespace std;int ans,n,S,c[100000+10]; int main(){    while(scanf("%d%d",&n,&S)!=EOF&&n&&S){        for(int i=1;i<=n;i++)scanf("%d",&c[i]),c[i]=c[i-1]+c[i];        ans=n+1;         int i=1,j;         for(j=1;j<=n;j++){            if(c[i-1]>c[j]-S) continue;            while(c[i]<=c[j]-S) i++;            ans=min(ans,j-i+1);        }        if(ans==n+1) printf("0\n");        else         printf("%d\n",ans);    }     return 0;}

这里写图片描述

原创粉丝点击