Poj 3061 Subsequence 队列区间求和

来源:互联网 发布:手机淘宝看注册时间 编辑:程序博客网 时间:2024/06/06 04:23

题意:按照顺序给定一组数,求出这组数中和大于等于m的最短子序列。

思路:1.strar=0开始求和sum知道sum>=m,更新最短序列的长度

           2.把sum从开始start位置开始一直减知道sum<m,过程中更新最短序列的长度过程中start++

代码:

#include <iostream>#include <stdio.h>#include <cstring>#include <cmath>#include <algorithm>#include <vector>#include <map>#include <queue>#define lson l,mid,num<<1#define rson mid+1,r,num<<1|1using namespace std;const int M=100005;int a[M];int main(){    int t,n,m;    scanf("%d",&t);    while(t--)    {        scanf("%d%d",&n,&m);        for(int i=0; i<n; i++)        {            scanf("%d",&a[i]);        }        int sum=0;        int start=0;        int i=0,mmin=n+1;        for(i=0; i<n;)        {            while(sum<m && i<n)            {                sum+=a[i++];               // i++;            }            while(sum>=m)            {                mmin=min(mmin,i-start);                sum-=a[start++];            }        }        if(mmin==n+1)        printf("0\n");        else        printf("%d\n",mmin);    }    return 0;}


原创粉丝点击