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

    xiaoxiao2021-03-26  29

    作者: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; }
    转载请注明原文地址: https://ju.6miu.com/read-662675.html

    最新回复(0)