B. Morning Jogging
首先我们要明确干什么
把所有数中 最小的 m 个数,每列放置一个
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N = 111;
const int inf = 1e9;
int n,m,a[N][N],b[N][N];
int main(){
int T,i,j,k,x;
cin>>T;
while(T--){
cin>>n>>m;
for(i=1;i<=n;i++)
for(j=1;j<=m;j++)
cin>>a[i][j];
for(k = m; k >= 1; k--)
{// 从最后一列开始处理,除了最小数所在行,其他行当前位置都是最大数
for(i = 1;i <= n; i++)
sort(a[i] + 1, a[i] + m + 1);
// 每次sort一遍所有行, 让当前行的最小数排在最前
// 最大数排在后边
x = 1;
for(i = 1; i <= n; i++)
if(a[i][1] < a[x][1])
x = i;
// 寻找矩阵中最小的数所在行 x
b[x][k] = a[x][1];
a[x][1] = inf;// 把个最小数删去
// 注意,我们现在只处理第 k 列
for(i = 1; i <= n; i++)
if(i != x)
{
b[i][k] = a[i][k], a[i][k] = inf;
}
}
for(i = 1;i <= n; i++)
{
for(j = 1;j <= m; j++)
cout << b[i][j] << ' ';
cout << endl;
}
}
return 0;
}
/*
1
3 3
10 3 2
8 7 5
5 1 6
*/
other
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int a[110][110];
int c[110];
bool cmp2(int x,int y)
{
return x>y;
}
struct node
{
int num;///value
int x,y;///row column
}b[10010];
bool cmp(node a,node b)
{
return a.num<b.num;
}
int main() {
int t;
cin>>t;
while(t--) {
int n,m;
cin>>n>>m;
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
memset(c,0,sizeof(c));
for(int i=0; i<n; i++) {
for(int j=0; j<m; j++) {
cin>>a[i][j];
b[i*m+j].num=a[i][j];
b[i*m+j].x=i;
b[i*m+j].y=j;
}
sort(a[i],a[i]+m,cmp2);///每行排序 big-->small
}
sort(b,b+n*m,cmp);///small-->big
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
if(b[j].x==i)
cout<<b[j].num<<" ";///find the j column's minn value
else cout<<a[i][c[i]++]<<" ";///大到小输出
}
cout<<endl;
}
}
return 0;
}