【每日一题】3月3日The Cow Lineup

The Cow Lineup

https://ac.nowcoder.com/acm/problem/106586

题意

题目意思很简单 就是给定一个序列a 然后让你找一个序列b 他不是这个序列a的的子序列 求这个序列b的最短的长度

那么怎么做呢

举个例子吧

10 4

1 2 3 4 1 2 3 4 1 2

我们看首先都出现过 所以最小的很明显不能取其中的一个

然后我们再看

把这四个数分为三组

1 2 3 4 | 1 2 3 4 | 1 2

这里我们就可以看出来了

第一组包含了的所有数字 第二组也包含了

那么我们如果取长度为2的序列 明显这个序列是包含了所有的

所以我们最少要取到三 这样前面两个数字都有但是第三个数字就可以取 3 或者4了

因此得到的序列就是一定不是那个序列的子序列了

所以我们的做法就是将原序列按是否包含了分组 然后答案就是包含了所有的组数+1就是答案了

code

#include <stdio.h>
#include <string.h>
typedef long long ll; typedef unsigned long long ull; typedef long double ld;
const ll MOD = 1e9 + 7;

const int N = 1e5 + 7;
const int INF = 0x3f3f3f3f;
bool vis[N];

int main(void){
    int n , m;
    scanf("%d%d" , &n , &m);
    ll ans = 0;
    ll cnt = 0 ;
    for(int i = 1 ; i <= n ; ++i){
        int k ;
        scanf("%d" , &k);
        if(!vis[k]){
            cnt++;
            vis[k] = 1;
            if(cnt == m){
                cnt = 0 ;
                ans++;
                memset(vis , 0 , sizeof(vis));
            }
        }
    }
    printf("%d\n" , ans + 1);
    return 0;
}
每日一题 文章被收录于专栏

写每日一题呀

全部评论

相关推荐

评论
点赞
收藏
分享
牛客网
牛客企业服务