洛谷题解:B4152 [厦门小学生 C++ 2022] 方阵排序

题目传送门

输入 #1

3
5 50 65
70 80 90
90 95 100

输出 #1

9 8 7
6 5 3
3 2 1

思路

把问题转化为求一个数在一堆数里的排名。

这时候直接用二分查找,但是二分查找是从小到大,但是这里是从大到小,所以用到一个技巧:把它们都取反。

例如这样:

for(int i=1;i<=n;i++) cin>>a[i],a[i]=-a[i];
sort(a+1,a+n+1);

实现了从大到小的排序。

像这样,本题代码就出来了。

#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,a[100005],b[100005];
signed main(){
	cin>>n;
	for(int i=1;i<=n*n;i++){
		cin>>a[i];
		b[i]=-a[i];
	}
	sort(b+1,b+n*n+1);
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			cout<<lower_bound(b+1,b+n*n+1,-a[(i-1)*n+j])-b<<" ";
		}
		cout<<endl;
	}
	return 0;
}
posted @ 2025-02-26 17:26  easy42  阅读(51)  评论(0)    收藏  举报