B4152 题解

· · 题解

题目传送门!

题目思路

创建一个结构体,里面包含每个同学的分数,编号,名次。

第一次排序:按分数从大到小排序一次,记录下排名。

第二次排序:按序号从小到大排序一次,得到输出。

这里不使用二维数组,而是直接把它当作一个长度为 n^2 的一维数组,在最后输出时换行即可。

代码

#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;//换行
    } 
}