質問
へのリンク注:
1. 質問での競争の順序は、実際にはマウス番号の順序です。つまり、6番のマウスが最初にランク付けされ、0番のマウスが2番目にランク付けされ、以下同様に続きます。
2.キューを使用して参加マウスを処理します。1匹のマウスを処理した後、キューを離れます。プロモートマウスは、キュー内の1匹のマウスだけがチャンピオンを決定するまで、キューに繰り返し入る必要があります。
3.アルゴリズムは3つのループで構成され、最も外側のループはラウンド数を処理し、内側の層は処理グループで、最も内側のループは各グループの各マウスを処理します。
4.競争の各ラウンドに参加するラットの数は異なり、最初はnpで、分割されたグループの数は後で、np / ngが分割されている場合、グループ番号はnp / ngです。分割されていない場合、グループ番号はnp / ng + 1です。 。各グループにはプロモーションがあり、その前にマウスのグループが存在する必要があるため、非前進マウスのランキングは現在のグループ番号グループ+ 1です。
#include<cstdio>
#include<algorithm>
#include<queue>
using namespace std;
struct mouse{//老鼠结构体
int weigth,rank;//重量和排名
}programmer[1010];
queue<int> q;
int main(){
int np,ng,order;
scanf("%d%d",&np,&ng);
for(int i=0;i<np;i++){//输入重量
scanf("%d",&programmer[i].weigth);
}
for(int i=0;i<np;i++){//按序输入编号
scanf("%d",&order);
q.push(order);//将编号入队,按照这个顺序进行后续处理
}
int temp=np,group;//temp为目前参赛的老鼠数,group为目前的组数
while(q.size()!=1){//决出冠军则跳出循环
if(temp%ng==0) group=temp/ng;//完全分组求组数
else group=temp/ng+1;//不完全分组求组数
for(int i=0;i<group;i++){//对每组进行处理
int k=q.front();//k为当前组最大重量老鼠的编号
for(int j=0;j<ng;j++){//对组中每只老鼠遍历
if(i*ng+j>=temp) break;
//最后一组老鼠数不足ng时可以跳出循环
int front=q.front();//队首老鼠的编号
if(programmer[front].weigth>programmer[k].weigth){
//找出本组最重老鼠的编号
k=front;
}
programmer[front].rank=group+1;
//该轮老鼠排名为group+1
q.pop();//将这只老鼠出队
}
q.push(k);//晋级的老鼠重新入队有机会修改排名
}
temp=group;//下轮参赛的老鼠数为group
}
programmer[q.front()].rank=1;//最后一个老鼠是冠军
for(int i=0;i<np;i++){//输出所有老鼠的排名
printf("%d",programmer[i].rank);
if(i<np-1) printf(" ");
}
return 0;
}