B4152 题解
题目传送门!
题目思路
创建一个结构体,里面包含每个同学的分数,编号,名次。
第一次排序:按分数从大到小排序一次,记录下排名。
第二次排序:按序号从小到大排序一次,得到输出。
这里不使用二维数组,而是直接把它当作一个长度为
代码
#include<bits/stdc++.h>
using namespace std;
struct stu{
int s,id,rk;
}a[10005];
bool cmp(stu a,stu b){//分数从大到小
return a.s>b.s;
}
bool cmp1(stu a,stu b){//序号从小到大
return a.id<b.id;
}
int main(){
int n;
cin>>n;
for(int i=1;i<=n*n;i++)cin>>a[i].s,a[i].id=i;
sort(a+1,a+n*n+1,cmp);
for(int i=1;i<=n*n;i++){//计算排名
if(a[i].s==a[i-1].s)a[i].rk=a[i-1].rk;
else a[i].rk=i;
}
sort(a+1,a+n*n+1,cmp1);
for(int i=1;i<=n*n;i++){
cout<<a[i].rk<<" ";
if(i%n==0)cout<<endl;//换行
}
}