Subsequence -尺取法

  • Subsequence

  •  POJ - 3061
  • 主要思想为:当a1,  a2  , a3 满足和>=S,得到一个区间长度3,那么去掉开头a1,   剩下 a2,a3,判断是否满足>=S,如果满足,那么区间长度更新,如果不满足,那么尾部向后拓展,判断a2,a3,a4是否满足条件。重复这样的操作。
  • 个人对尺取法的理解:当一个区间满足条件时,那么去掉区间开头第一个数,得到新区间,判断新区间是否满足条件,如果不满足条件,那么区间末尾向后扩展,直到满足条件为之,这样就得到了许多满足条件的区间,再根据题意要求什么,就可以在这些区间中进行选择,比如区间最长,区间最短什么的。这样跑一遍下来,时间复杂度为O(n)。
  • #include<iostream>
    using namespace std;
    #define maxn 100005
    int n,t,a[maxn],r,ans;
    int sum[maxn],k;
    int main()
    {
        cin>>t;
        while(cin>>n>>k)
        {
            sum[0]=0;
            ans=n+10;
            r=1;
            for(int i=1; i<=n; i++)
            {
                cin>>a[i];
                sum[i]=a[i]+sum[i-1];
            }
            for(int i=0; i<n; i++)
            {
                while(r<=n&&sum[r]-sum[i]<k)
                    r++;
                if(r==n+1)
                    break;
                if(r-i<ans)
                    ans=r-i;
            }
            if(ans==n+10)
                cout<<0<<endl;
            else
            cout<<ans<<endl;
        }
        return 0;
    }
    

猜你喜欢

转载自blog.csdn.net/BePosit/article/details/82154678