题意:外排的选择替换算法模拟
tips:模拟+优先队列
注:非满分版本,当时考试被陈姥姥卡在最后一个测试点超时了
#include<iostream>
#include<queue>
#include<algorithm>
#include<vector>
using namespace std;
int main() {
int n,k;
cin>>n>>k;
vector<int> ans(n);
for(int i=0; i<n; ++i)
scanf("%d",ans[i]);
while(1) {
vector<int>temp;
priority_queue<int,vector<int>,greater<int>> q;
vector<int> ans1;
int la=0;
int count=0,minnum;
for(int i=0; i<ans.size(); ++i) {
if(ans[i]>=la) {
q.push(ans[i]);
count++;
if(count==k) {
count--;
minnum=q.top();
q.pop();
ans1.push_back(minnum);
la=minnum;
}
} else temp.push_back(ans[i]);
}
while(!q.empty()) {
ans1.push_back(q.top());
q.pop();
}
if(ans1.size())
printf("%d",ans1[0]);
for(int j=1; j<ans1.size(); ++j)
printf(" %d",ans1[j]);
printf("\n");
ans=temp;
if(ans.size()<2)
break;
}
if(ans.size()==1)
cout<<ans[0];
return 0;
}