题目:click me~
题意:给出NP只老鼠的质量和它们的初始顺序,按每NG只分为一组,最后剩下的为一组。对每组老鼠,选出质量最大的1只晋级,晋级的老鼠数就等于该轮分组组数。对这些晋级的老鼠再按上面的方法每NG分为一组,选出质量最大的一批继续晋级,这样到最后只剩下1只老鼠,排名为1。按照原输入顺序输出这些排名。
解题思路:
步骤一:开出一个结构体mouse,用以记录每只老鼠的质量和排名。定义一个队列,在算法过程中按顺序处理每轮的老鼠。
步骤二:首先算出组数group。
1.用temp记录当前轮参赛老鼠数(初始为NP),group记录当前轮的组数,初始时将老鼠们的编号按顺序加入队列;
2.进入while循环,每一层循环是一轮晋级。
3.每一轮晋级,枚举当前轮的temp只老鼠,按每NG只老鼠选出组内质量最大的老鼠,将其入队(晋级),而其他的老鼠排名为group+1,晋级的老鼠会在下一轮得到新的排名。直到队列中只剩下1只老鼠,排名记为1.最后输出所有老鼠的排名。
code
#include<iostream>
#include<queue>
using namespace std;
const int maxn = 1010;
struct mouse {
int weight, R;
}mouse[maxn];
int main() {
int np, ng, order;
cin >> np >> ng;
for (int i = 0;i < np;i++)cin >> mouse[i].weight;
queue<int> q;
for (int i = 0;i < np;i++) {
cin >> order;
q.push(order);
}
int temp = np, group;//temp为当前轮比赛总老鼠数,group为组数
while (q.size() != 1) {
//计算group,当前轮分几组比赛
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;//在最后一组中起作用,及时退出循环
int front = q.front();//队首老鼠编号
if (mouse[front].weight > mouse[k].weight)k = front;//找出质量最大的老鼠
mouse[front].R = group + 1;//该轮老鼠排名为group+1
q.pop();
}
q.push(k);//胜利的老鼠晋级
}
temp = group;//group只老鼠晋级,下一轮老鼠总数为group
}
mouse[q.front()].R = 1;//队列中只剩一只老鼠时,令其排名为1
//输出所有老鼠的信息
for (int i = 0;i < np;i++) {
cout << mouse[i].R;
if (i < np - 1)cout << " ";
}
return 0;
}