YTU 2363 完美旗手队列

完美旗手队列


YT大学定于5月16日举行校运动会。学校有 n 个系。组委会要求每个系有 m 个运动员参加开幕式,并且每个系的 m 个运动员站成一队。我们假设 n*m 名运动员站成一个n行m列的队列,表示为Anm:下图中的每一行代表一个系。

 

a11 a12 a13  a1m

a21 a22 a23  a2m

       

an1 an2 an3  anm

 

现组委会要求每系在 m 个运动员中选出一名旗手站在本系的前面,为了视觉上的美观,要求相邻的旗手身高差距尽可能的小,形成一个完美旗手队列。比如我们从上述队列中选择出{a12, a24, a33,  , ank}作为旗手队列。则这n个人的身高差最小的队列是完美旗手队列。比如有4个系,各系选择的旗手分别为a,b, c, d,  val=|a-b|+|b-c|+|c-d| 最小的选择为完美旗手队列。你能帮YT大学选择完美旗手队列吗?

Input

多个测试样例,每个测试样例第一行为两个整数n, m (1 <= n, m <= 1000) ,接着是n行整数数列,表示原始的队列,整数值表示运动员的身高(<=10000)。

Output

对于每一个测试样例,输出最小的val值。

Sample Input

3 32 3 14 7 67 9 2

Sample Output

3


//先对数组每一行进行从小到大排序,用lower_bound从第二行开始找上一行
//大于a[i][j]的数,找到后返回此数的下标t,再分两种情况,与b[i][j]比较

//找到后不仅要与a[i][t]比较也要与它前一个数比较,因为绝对值最小的情况只
//可能出现在这俩数当中

//因为也有找不到的情况,这时候所以就把t-1那个数再与b[i][j]比较

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#define inf 1<<30
#define MIN(a,b) a>b?b:a
int a[1001][1001];
int b[1001][1001];
using namespace std;
int main()
{
    int i,j;
    int n,m;
    while(scanf("%d%d",&n,&m)!=EOF)
    {
        for(i=0;i<n;i++)
        {
            for(j=0;j<m;j++)
            {
                scanf("%d",&a[i][j]);
            }
            sort(a[i],a[i]+m);
        }
        memset(b,0,sizeof(b));
        for(i=1;i<n;i++)
        {
            for(j=0;j<m;j++)
            {
                b[i][j]=inf;
                int t=lower_bound(a[i-1],a[i-1]+m,a[i][j])-a[i-1];
                if(t<m)
                {
                    b[i][j]=MIN(b[i][j],b[i-1][t]+abs(a[i][j]-a[i-1][t]));
                }
                if(t>0)
                {
                    b[i][j]=MIN(b[i][j],b[i-1][t-1]+abs(a[i][j]-a[i-1][t-1]));
                }
            }
        }
        int mi=9999;
        for(i=0;i<m;i++)
        {
            mi=MIN(mi,b[n-1][i]);
        }
        printf("%d\n",mi);
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Loganer

感谢

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值