前言
正文
参考题解
#include<iostream>
#include<algorithm>
#include<queue>
using namespace std;
/* 题意: np只老鼠,每ng只老鼠为一组(最后不满ng只的老鼠也作为一组), 每组中重量最重的老鼠可以晋级下一轮比赛,下一轮又按照每ng只老鼠进行分组。 循环往复直到最后只剩一只老鼠。 思路: 1、因为输入给出了初始的order,而下一轮的order又是有本轮的order决定的,因此可以 考虑使用queue(先进先出) 2、每轮比赛可以分多少group,表示晋级下一轮比赛的老鼠个数为group,而本轮被 淘汰的老鼠的名次则为group+1 3、若当前轮比赛的老鼠有cnt只,若cnt%ng==0,则group=cnt/ng;否则说明不能恰好分完, 则group=cnt/ng+1; 4、考虑到输入时需要保存老鼠重量,输出时需要输出每个老鼠的排名,故用结构体进行保存 */
const int N=1e3+10;
struct Mouse{
int weight,rank;
}mouse[N];
int main(){
int np,ng;
queue<int> q;
cin>>np>>ng;
for(int i=0;i<np;i++){
scanf("%d",&mouse[i].weight);
}
int order;
for(int i=0;i<np;i++){
cin>>order;
q.push(order);
}
int cnt=np,group;//cnt表示本轮老鼠的总数,group表示本轮分几组,同时也是晋级下一轮的老鼠数量
while(cnt!=1){
//确定本轮分多少组
if(cnt%ng==0)group=cnt/ng;
else group=cnt/ng+1;
//遍历每组,获取晋级下一轮的老鼠编号
for(int i=0;i<group;i++){
int maxW=q.front();//maxW表示本组中重量最重的老鼠编号
for(int j=0;j<ng;j++){
//这里需要注意最后一组不足ng只老鼠的情况,就直接退出,否则会出现错误
//i*ng+j表示下标,故应该是大于等于cnt
if(i*ng+j>=cnt)break;
int front=q.front();
if(mouse[front].weight>mouse[maxW].weight){
maxW=front;
}
mouse[front].rank=group+1;
q.pop();//该只老鼠出队列
}
q.push(maxW);//将每组获胜的老鼠再次进队列,进入下一轮
}
cnt=group;//group只老鼠晋级
}
mouse[q.front()].rank=1;//队列中只剩一只老鼠时,它就是第一名
printf("%d",mouse[0].rank);
for(int i=1;i<np;i++){
printf(" %d",mouse[i].rank);
}
return 0;
}