题目链接:https://pintia.cn/problem-sets/994805342720868352/problems/994805419468242944
题目大意:第一行,np只老鼠,每ng只一组;第二行,每只老鼠的重量;第三行,初始顺序,这里解释一下,这个顺序是老鼠的编号,例如样例给出的6 0 8 7 10 5 9 1 4 2 3,意思是6号老鼠在第一位,0号老鼠在第二位,依次类推。
分析:用队列存储老鼠编号,每次都淘汰一些,直到队列中只有一个元素为止。
#include <bits/stdc++.h>
using namespace std;
const int N = 1010;
int np, ng;
struct node {
int w, rank;
}a[N];
int main() {
scanf("%d %d", &np, &ng);
for(int i = 0; i < np; i++)
scanf("%d", &a[i].w);
queue<int> q;
for(int i = 0; i < np; i++) {
int x;
scanf("%d", &x);
q.push(x);
}
int tmp = np;
while(q.size() != 1) {
int group = tmp / ng;
if(tmp % ng != 0) group++;
int sum = 0;
for(int i = 1; i <= group; i++) {
int cnt = 0, maxi = -1, id = -1;
while(1) {
if(sum == tmp) break;
if(cnt == ng) break;
int k = q.front();
q.pop();
if(a[k].w > maxi) {
maxi = a[k].w;
id = k;
}
a[k].rank = group + 1;
cnt++;
sum++;
}
q.push(id);
}
tmp = group;
}
int k = q.front();
a[k].rank = 1;
for(int i = 0; i < np; i++)
printf("%d%s", a[i].rank, i == np - 1 ? "\n" : " ");
return 0;
}