1056 Mice and Rice
题目大意
Np只老鼠,每次分为若干组晋级(每组数量始终为Ng),一直比赛知道只剩一只老鼠。具体比赛制度看英文,有点难懂。
注意
1、队列的使用
2、每组未晋级的老鼠排名为每轮比赛的组数group+1,如果晋级,排名会在下一轮比赛是覆盖。
3、考虑只有1只老鼠的特殊情况,在循环结束后还要对排名第一的老鼠赋值。
4、最后一组老鼠数不足Ng只时要跳出循环。
代码
#include<stdio.h>
#include<iostream>
#include<queue>
using namespace std;
struct Mouse{
int weight;
int rank;
}M[1001];
queue<int> q;
int main(void){
int np,ng;
scanf("%d%d",&np,&ng);
for(int i=0;i<np;i++)scanf("%d",&M[i].weight);
for(int i=0;i<np;i++){
int tmp;
scanf("%d",&tmp);
q.push(tmp);//初始序列
}
int group;//每轮比赛的组数,淘汰老鼠的名次=group+1
int num=np;//每轮比赛的总老鼠数
while(q.size()!=1){
if(num%ng==0)group=num/ng;
else group=num/ng+1;
//开始每一组的比赛
for(int i=0;i<group;i++){
int max=q.front();//存储每组晋级的序号
for(int j=0;j<ng;j++){
if(i*ng+j>=num)break;//如果最后一组老鼠数不足ng
int front=q.front();
if(M[front].weight>M[max].weight){
max=front;//如果当前队首的weight比max大
}
M[front].rank=group+1;//比过赛就出队,排名为group+1,如果晋级的话,排名会被覆盖。
q.pop();
}
q.push(max);//晋级的再入队
}
num=group;//进入下一轮,老鼠数量减少为group
}
M[q.front()].rank=1;
for(int i=0;i<np;i++){
if(i==np-1)printf("%d",M[i].rank);
else printf("%d ",M[i].rank);
}
}