洛谷题解: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;
}

浙公网安备 33010602011771号