[入门oj1531]士兵训练

Description
N个士兵排成一队进行军事训练,每个士兵的等级用1…K范围内的数来表示,长官每隔1小时就随便说出M个等级a1,a2…am(1≤ai≤K,M个等级中允许有重复),如果这M个等级组成的序列是排成一队的N个士兵等级序列的子序列,那么训练继续;否则训练结束。长官想知道,M至少为多少时,训练才有可能结束。
例:士兵等级序列为1 5 3 2 5 1 3 4 4 2 5 1 2 3,长官说出的等级序列为5 4,那么训练继续,如果长官说出的等级序列为4 4 4,那么训练结束。
Input
第一行为两个整数N和K(1≤N≤100000,1≤K≤10000),下面N行,每行一个数,按队伍顺序表示每个士兵的等级。
Output
包括一行,只包含一个数M,表示当长官至少说出M个等级的时候,训练才有可能结束。
Sample Input
14 5
1
5
3
2
5
1
3
4
4
2
5
1
2
3
Sample Output
3

前言:
这题我认为一定要写题意简述。。。
因为这题太TMD坑了。。。
打的标签是队列。。其实我也不知道是什么

题意简述:
我的理解是这样的:
先给你n和k,然后给你一串数字,问在这一串数中出现次数最少的数出现的个数。woc这不是水题吗?
然后。。血红的WA
刺激。。
然后注意到了一点: 子序列??
我产生了疑惑
到底什么是子序列??
百度一下。。woc不要按顺序???震惊!!
好吧。。然后改了就AC了。。
绝望.jpg

直接上代码了
code:

#include
using namespace std;
const int maxn=100001;
int n,m,k,ans;
int a[maxn],c[maxn];
int read(){
    int x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    return x*f;
}
int main(){
    n=read();m=read();
    for(int i=1;i<=n;i++)a[i]=read();
    ans=0;k=0;
    for(int i=1;i<=n;i++){
        if(c[a[i]]==ans){c[a[i]]++;k++;}
        if(k==m){ans++;k=0;}
    }
    printf("%d\n",ans+1);
    return 0;
}

你可能感兴趣的:(杂题)