秀姿势【模拟】【哈希】

题目大意:

“蓝猫淘气三千问,看蓝猫,我有姿势我自豪!”话说能考上HYSBZ的孩纸们肯定都是很有姿势的孩纸们,但是大家普遍偏科,都只有一门科目考得好。已知HYSBZ的入学考试科目数量小于等于10^9,而有n个学生参加了入学考试。现在HYSBZ要刷人了,招生办每一次刷人会把一个科目考得好的人全部刷掉,但是最多不能刷超过K次。(刷就是不录取)而HYSBZ的校长看录取名单时,最喜欢看的就是连续都是同一个科目考得好的人。他定义完美学生序列为连续且考得好的科目都为同一门的学生序列。现在招生办主任想让你帮他设计一种录取方案,使得最长的完美学生连续子序列尽量长。


思路:

队列+哈希/map/快拍+二分

用队列维护一个区间,使得这个区间的不同数字个数不超过k+1,统计出来的每个合法区间的众数的数量的最大值便为答案。


代码:

#include <cstdio>
#include <iostream>
#include <queue>
#include <map>
using namespace std;

int n,k,x,s,a,ans;
queue<int> q;
map<int,int> num;  //每个数字的个数

int main()
{
    scanf("%d%d",&n,&k);
    for (int i=1;i<=n;i++)
    {
        scanf("%d",&x);
        if (!num[x])  //队列里没有这个数字
        {
            s++;
            while (s>k+1)  //数字个数超过可k
            {
                a=q.front();  
                q.pop();
                num[a]--;  //这个数字数量减一
                if (!num[a]) s--;  //没有这个数字了
            }
        }
        num[x]++;  
        q.push(x);
        if (num[x]>ans) ans=num[x];  //求最大值
    }
    printf("%d\n",ans);
    return 0;
}
原文地址:https://www.cnblogs.com/hello-tomorrow/p/9336704.html