题意:n^2个数,n行n列,每行每个数字比另一行数字大的个数总和的最小值最大。
例如:
在第一次测试中我们可以分开9实验室分组{2,8,5},{9,3,4},{7,6,1}.
从第一组到第二组我们可以传送4水单位(8→3,8→4,5→3,5→4).
从第一组到第三组,我们可以运输。5水单位(2→1,8→7,8→6,8→1,5→1).
从第二组到第一组我们可以传送5水单位(9→2,9→8,9→5,3→2,4→29→2).
从第二组到第三组,我们可以运输。55水单位(9→7,9→6,9→1,3→1,4→19→7).
从第三组到第一组我们可以传送44水单位(7→2,7→5,6→2,6→57→2).
从第三组到第二组,我们可以运输。44水单位(7→3,7→4,6→3,6→47→3).
可以从一组输送到另一组的水单位之和的最小数目等于44...可以证明,要进行更好的划分是不可能的。
思路:
只需把每列大值与小值颠倒即可;
例如:
3
9 4 3
8 5 2
7 6 1
代码如下:
#include<bits/stdc++.h>
using namespace std;
int a[310][310];
int main(){
int n;
scanf("%d",&n);
int t=n*n;
for(int i=0;i<n;i++){
if(i%2==0){
for(int j=n-1;j>=0;j--){
a[j][i]=t--;
}
}else{
for(int j=0;j<n;j++){
a[j][i]=t--;
}
}
}
for(int i=0;i<n;i++){
printf("%d",a[i][0]);
for(int j=1;j<n;j++){
printf(" %d",a[i][j]);
}
printf("\n");
}
return 0;
}