1 条题解

  • 0
    @ 2025-8-24 21:17:26

    自动搬运

    查看原文

    来自洛谷,原作者为

    avatar Jasoncwx
    关注@Jasoncwx谢谢喵!最后在线时间:2025年8月24日19时1分

    搬运于2025-08-24 21:17:25,当前版本为作者最后更新于2025-02-19 22:51:43,作者可能在搬运后再次修改,您可在原文处查看最新版

    自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多

    以下是正文


    题目传送门!

    题目思路

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

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

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

    这里不使用二维数组,而是直接把它当作一个长度为 n2n^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;//换行
    	} 
    }
    
    • 1

    信息

    ID
    11514
    时间
    1000ms
    内存
    256MiB
    难度
    2
    标签
    递交数
    0
    已通过
    0
    上传者