小蜗蜗所在班级的同学在操场上排队,排成了一个 n� 行 n� 列的方阵,行号列号分别从 11 到 n�。
小蜗蜗的老师想知道排好的这个方阵里最优美的队伍是哪一行或列,队列的优美值定义为:这一行或列的 n� 个人每一对相邻同学的身高差的绝对值(就是身高较高的减去身高较低的值)之和。优美值最低的那一行或列为最优美的队伍。
例如如下方阵:
3 5
7 8
第一行的优美值为 5−3=25−3=2,第二行的优美值为 8−7=18−7=1; 第一列的优美值为 7−3=47−3=4, 第二列的优美值为 8−5=38−5=3。
如果第 i� 行或列 与 第 j� 行或列的优美值相等,那么取 i� 或 j� 中较大的那一个行或列为答案;如果 i� 和 j� 相等,那么答案为这一列。
-
例如第 22 行和第 33 列的优美值相等,答案为第 33 列;
-
如果第 55 行和第 44 行的优美值相等,答案为第 55 行;
-
如果第 66 行和第 66 列的优美值相等,答案为第 66 列。
现在要你求出最优美的队伍所在的位置,最小的优美值,以及这个队伍中同学的身高分别为多少。
输入格式
第一行一个整数 n�,表示方阵大小。
接下来 n� 行,每行 n� 个数字表示 ai,j��,�。
输出格式
第一行输出 "di xxx hang" 或 "di xxx lie","xxx" 用具体数字代替,其前后均有一个空格,表示最优美的那一行或列的编号。
第二行输出最小的差值。
第三行输出 n� 个数字,用空格隔开,表示答案所在那一行或列的所有人的高度。如果答案是某一行,那么按列号从 11 到 n� 输出;如果答案是某一列,那么按行号从 11 到 n� 输出。
输出和标准答案比较时,忽略行末空格和文末回车。
样例输入1
2
3 5
7 8
样例输出1
di 2 hang
1
7 8
样例输入2
3
100 5 100
5 100 5
100 5 100
样例输出2
di 3 lie
190
100 5 100
样例2解释
所有行和列的差值都相同,都等于 190190。所以输出列号最大的那一列。
数据规模
对于所有数据,
保证 2≤n≤1000,1≤ai,j≤100002≤�≤1000,1≤��,�≤10000。
#include<bits/stdc++.h>
using namespace std;
int a[10005][10005];
int n;
int hang[1010],lei[1010],mi1,mi2,x,y;
int main(){
scanf("%d",&n);
for(int i = 1;i <= n; i++)
for(int j = 1; j <= n ; j++)
scanf("%d",&a[i][j]);
for(int i = 1;i <= n; i++)
for(int j = 1; j <= n - 1;j++)
if(a[i][j] >= a[i][j + 1])
hang[i] += a[i][j] - a[i][j + 1];
else
hang[i] += a[i][j + 1] - a[i][j];
for(int j = 1;j <= n; j++)
for(int i = 1; i <= n - 1;i++)
if(a[i][j] >=a[i + 1][j])
lei[j] += a[i][j] - a[i + 1][j];
else
lei[j] += a[i + 1][j] - a[i][j];
mi1 = hang[1];
x = 1;
for(int i = 2;i <= n; i++)
if(hang[i] <= mi1){
mi1 = hang[i];
x = i;
}
mi2 = lei[1];
y = 1;
for(int j = 2;j <= n; j++)
if(lei[j] <= mi2){
mi2 = lei[j];
y = j;
}
if(mi1 < mi2 || (mi1 == mi2 && x > y)){
printf("di %d hang\n%d\n",x, mi1);
for(int i = 1; i <= n; i++)
printf("%d ",a[x][i]);
}
else
if(mi1 > mi2 ||(mi1 == mi2 && y >= x)){
printf("di %d lei\n%d\n",y, mi2);
for(int i = 1; i <= n; i++)
printf("%d ",a[i][y]);
}
return 0;
}