Daimayuan Online Judge最优美的队伍

小蜗蜗所在班级的同学在操场上排队,排成了一个 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;
}                                              

  • 10
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值