【数据结构 | C++】优质的随从慕名而来

学长计划招揽n个随从,第i个随从的种类是ai。学长依次买下每一个随从。但他只能携带m个随从,当新买的随从无法加入队伍时,他只好卖掉队伍里之前最早买下的随从。当学长买下一个种类为x的随从时,若队伍里有另外两个随从种类也为x,他就凑成了一个“三连”。此时“三连”会将队伍中两个种类为x的随从移除,然后使买下的那个随从变为“金色”并加入队伍。每当学长获得“金色”随从时,学姐会卖掉这个”金色“随从。学姐想知道她将卖掉多少金色随从。

输入格式:第一行包含两个正整数 n,m(1<=m<=n<=1e6),表示随从的个数和队伍的容量;第二行包含n个整数 ai(1<=ai<=1e6),表示第i次买下的随从的种类。输出格式:输出一个整数,表示卖出个数。

输入示例: 10 3 \n 2 1 1 1 2 3 3 1 3 1 输出示例:2

#include <bits/stdc++.h>
using namespace std;
int a[1000005],b[100005];//a[]记录每种类型随从的数量 
int main(){//b[]记录每种类型应删除随从的数量 
	int n,m;cin>>n>>m;queue<int> q;int cnt=0;
	for(int i=0;i<n;i++){
		int ai;cin>>ai;a[ai]++;q.push(ai);
		if(a[ai]==3){//触发三连 
			a[ai]=0;
			b[ai]+=3;
			m+=3; //触发三连,所以删去三个后容量加三
			cnt++;//卖出的金色随从数量加1 
		}
		if(q.size()>m){
			a[q.front()]--;//最早购买的随从数量减一 
			q.pop();//pop()弹出队首
		}
		while(b[q.front()]>0){
			b[q.front()]--;
			q.pop();
			m--;//重要 
		}
	}cout<<cnt;return 0;
} //使用案例推一遍代码即可理解 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秋说

感谢打赏

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值