题目大意:
“蓝猫淘气三千问,看蓝猫,我有姿势我自豪!”话说能考上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; }