借用一下算法笔记中的题目解释
注意的点有:
1.当老鼠总数不能整除NG时,对于group的处理
2.每组晋级一只老鼠,所以进入下一轮的老鼠为group只,这一轮淘汰的老鼠排名为group+1.在程序中处理方式是,每轮都把所有老鼠的排名赋值为group+1,这样晋级到下一组的老鼠可以再更新rank,而淘汰的排名即为group+1
3.使用queue保存每轮顺序,直到只有一只老鼠,它的排名为1
#include<cstdio>
#include<queue>
using namespace std;
int n,m;
struct mouse
{
int weight,r;
}mouse[1005];
queue<int> q;
int main()
{
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++)
scanf("%d",&mouse[i]);
int order;
for(int i=0;i<n;i++)
{
scanf("%d",&order);
q.push(order);
}
int temp=n,group;//temp为该轮老鼠总数
while(q.size()!=1)
{
if(temp%m==0) group=temp/m;
else group=temp/m+1;
for(int i=0;i<group;i++)
{
int t=q.front();
for(int j=0;j<m;j++)
{
if(i*m+j>=temp) break;//最后一组可能不足m只,及时退出循环
int p=q.front();
if(mouse[p].weight>mouse[t].weight)
t=p;
mouse[p].r=group+1;
q.pop();
}
q.push(t);//该组中weight最大的老鼠晋级
}
temp=group;
}
mouse[q.front()].r=1;//剩一只老鼠,排名为1
for(int i=0;i<n;i++){
printf("%d",mouse[i].r);
if(i<n-1) printf(" ");
}
return 0;
}