Description
在一维坐标轴上有许多宝藏,总共n种宝藏,每种宝藏有k个。现在共k个人寻宝,k个人初始位置可以位于任意点。但是每人需要按指定顺序捡起宝藏(1->2->3->…->n,先捡第1种,再捡第2种。。。最后捡第n种宝藏,每种宝藏捡起一个)。每个人要捡起n个宝藏。现在你自己规划好k个人的初始位置与寻宝路线(一个宝藏只能被一个人捡起),求k个人所走路程的和最短是多少。
Input
第一行两个整数:n,k接下来n行,每行k个整数x,表示宝藏在一维坐标轴上的位置。
(1<=n<=100)
(1<=k<=8)
(-1000,000,000<=x<=1000,000,000)
Output
输出一个数最短的距离和
Sample Input 1
2 3
-1 1 3
-2 2 4
Sample Output 1
3
Hint
样例解释:
第一个人:从-1到-2
第二个人:从1到2
第三个人:从3到4
Source
2019年集训队选拔赛
思路:贪心,待补
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#define ll long long
ll n,m,b[1000][1000]={0};
using namespace std;
int main(){
while (~scanf("%lld%lld",&n,&m)){
for (ll i=0;i<n;i++){
for (ll j=0;j<m;j++){
scanf("%lld",&b[i][j]);
}
sort(b[i],b[i]+m);
}
ll ans=0;
for (ll i=1;i<n;i++){
for (ll j=0;j<m;j++){
ans+=abs(b[i][j]-b[i-1][j]);
}
}
printf("%lld
",ans);
}
return 0;
}