LA2678 - Subsequence(求序列中长度最短的和>=S的子序列长度)

来源:互联网 发布:ubuntu命令行设置中文 编辑:程序博客网 时间:2024/05/10 18:55

自己看完题目敲了。。

给出n s

然后n个数的序列

要从序列中找子序列 使得和大于s 要序列长度最小 求这个长度

这题目 看了就想到双指针了 敲后过了  在注释里写思想吧

#include<cstdio>#include<cstring>#include<iostream>#include<algorithm>using namespace std;const int maxn=100000+10;int arr[maxn];int main(){    //freopen("/home/gl/acm/in","r",stdin);    int n,s;    while(scanf("%d %d",&n,&s)!=EOF)    {        for(int i=0;i<n;++i)        scanf("%d",&arr[i]);        int sum=0,ans=n+1,index1=0,index2=0;        while(sum<s && index2<n)//先找到从起点开始 和大于s的那个index2 得到index2 之前的所有和大于s        {            sum+=arr[index2++];        }        if(sum<s)//这种情况就是index2到头了 还没有大与等于s 那就没答案了        {            printf("0\n");            continue;        }        ans=index2;//ans表示长度        while(index1<index2 && index2<=n)//index2 等于n是可以的 表示到头了index 1不能等于index2        {            sum-=arr[index1++];//每次index1 向前移动 sum减去index1那的值            if(sum>=s){//如果还满足 更新ans                ans=min(ans,index2-index1);            }            else{//不满足了 就得找满足的条件了 index2 又得往前走了                 while(sum<s && index2<=n)                     sum+=arr[index2++];                 if(sum<s)                 break;                 else                 ans=min(ans,index2-index1);            }        }        printf("%d\n",ans);    }    return 0;}


原创粉丝点击