对抗
题目描述:
现在要进行一场对抗赛,每个选手有一个能力值。比赛是这样进行的:先对n个人按编号依次进行分组,每m个人一组,如果最后一个组的人数不够m个,他们也算一组。每组中,能力值最高的人晋级到下一场,继续进行分组对抗,至到剩下一个人。进行时,每一轮中,输掉的人的排名相同。本轮比赛的人的名次比上一轮高。请你输出最后每个人的名次。
输入格式:
输入数据第一行两个整数n和m,n表示总人数,m表示每组的人数。 第二行n个数据,表示编号为1到n的 每个人的能力值,能力值都不相同。
输出格式:
输出一行,表示比赛结束后,每个选手的排名。
样例输入:
9 2 1 6 7 2 5 8 9 4 10
样例输出:
6 4 3 6 6 4 2 6 1
提示:
n<=1000,m<=50
#include<bits/stdc++.h>
using namespace std;
int n,m,b[10001],c[10001],k,e,p,j,n1;
struct data{
int x;
int num;
int mc;
int lastmc;
};
bool cmp(data x,data y){
return x.mc > y.mc;
}
bool cmp2(data x,data y){
return x.num < y.num;
}
data a[10001];
int main() {
cin >> n >> m;
for(int i=1; i<=n; i++) {
cin >> a[i].x;
a[i].num = i;
a[i].mc = 1;
}
for(int i=1; i<=n/2; i++){
int s=0,maxn=-1e9,maxk;
for(int j=1; j<=n; j++){
if(a[j].mc == i){
if(a[j].x > maxn){
maxn = a[j].x;
maxk = j;
}
s++;
if(s == m){
a[maxk].mc = i+1;
s=0;
maxn=-1e9;
}
}
}
if(s != 0) a[maxk].mc = i+1;
}
sort(a+1,a+1+n,cmp);
for(int i=1; i<=n; i++){
if(a[i].mc != a[i-1].mc)
a[i].lastmc = i;
else
a[i].lastmc = a[i-1].lastmc;
}
sort(a+1,a+1+n,cmp2);
for(int i=1; i<=n; i++){
cout << a[i].lastmc << " ";
}
return 0;
}
AC代码如上。