UVA11536:Smallest Sub-Array(最短子序列)

来源:互联网 发布:淘宝直通车溢价怎么算 编辑:程序博客网 时间:2024/04/30 01:53

作者:xq的acm之路

题目链接:https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=2531

题目大意:给你一个公式:
X1 = 1
X2 = 2
X3 = 3
Xi = (Xi-1 + Xi-2 + Xi-3) % M + 1 for i = 4 to N
最多N个数,这些数组成一个序列,让你求出一个连续的序列1-K,在组成的1-K这个序列中,数的个数尽可能的少。

思路:两端收缩,符合条件就停止

代码如下:

#include <iostream>#include <cstring>#include <algorithm>using namespace std;int a[1000001],b[1001];int main(){    memset(a,0,sizeof(a));    int t,p=0;    cin>>t;    while(t--)    {        p++;        int n,m,k;        cin>>n>>m>>k;        memset(b,0,sizeof(b));        if(k<=3)        {            cout<<"Case "<<p<<": "<<k<<endl;            continue;        }        for(int i=0; i<=3; i++)            a[i]=i;        b[1]=b[2]=b[3]=1;        int l=1,ans=3,Min=10000000;        for(int j=4; j<=n; j++)        {            a[j]=(a[j-1]+a[j-2]+a[j-3])%m+1;            if(!b[a[j]])            {                b[a[j]]=1;                if(a[j]<=k)                    ans++;            }            else            {                b[a[j]]++;            }            if(ans==k)            {                Min=min(Min,j-l+1);            }            while(l<=j)            {                if(a[l]<=k&&b[a[l]]==1)                    break;                b[a[l]]--;                l++;                if(ans==k)                {                    Min=min(Min,j-l+1);                }            }        }        if(Min!=10000000)            cout<<"Case "<<p<<": "<<Min<<endl;        else            cout<<"Case "<<p<<": sequence nai"<<endl;    }    return 0;}
0 0
原创粉丝点击