使用队列,每一组最大的进队,该组其余元素出队,并生成排名,排名等于当前组数加1。需要注意,因为最后一组可能不足Ng个,因此在处理最后一组时需要计算该组老鼠数,而不能认为是Ng个,否则可能会把下一轮的第一组读入。
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
struct prog{
int rank;
int weight;
};
int main(){
int n,g;
cin>>n>>g;
queue<int>q;
prog player[n];
for(int i=0;i<n;i++)
cin>>player[i].weight;
for(int i=0;i<n;i++){
int order;
cin>>order;
q.push(order);
}
while(q.size()>1){
int groups=(q.size()%g==0)?q.size()/g:q.size()/g+1;
int i=0;
int size=q.size();
while(i<groups){
int pos=q.front();
q.pop();
int terminal=(size-i*g<g)?size-i*g:g;
for(int j=1;j<terminal;j++){
if(player[q.front()].weight>player[pos].weight){
player[pos].rank=groups+1;
pos=q.front();
}
else{
player[q.front()].rank=groups+1;
}
q.pop();
}
q.push(pos);
i++;
}
}
player[q.front()].rank=1;
for(int i=0;i<n-1;i++)cout<<player[i].rank<<" ";
cout<<player[n-1].rank;
return 0;
}
分析起来有点绕,并且不想思考