秀姿势模拟哈希

Posted hello-tomorrow

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了秀姿势模拟哈希相关的知识,希望对你有一定的参考价值。

题目大意:

“蓝猫淘气三千问,看蓝猫,我有姿势我自豪!”话说能考上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
",ans);
    return 0;
}

 

以上是关于秀姿势模拟哈希的主要内容,如果未能解决你的问题,请参考以下文章

CodeForces - 950C Zebras 模拟变脑洞的天秀代码

STM32模拟Linux自动初始化,秀

情人节攻略:用Python撒狗粮的正确姿势

2017年创意秀

L2-028 秀恩爱分得快(模拟)

下文中的哈希片段指的是啥?