学长计划招揽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;
} //使用案例推一遍代码即可理解

被折叠的 条评论
为什么被折叠?



