题目链接https://csustacm.fun/problem/1088
Time limit 1000 ms
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
这道题看起来好像要用dp,有点复杂emmm。。。不过稍微转一下弯就会发现:要使路径最短,则必须按照小对小,大对大的模式,所以,给每行排个序然后从第一行往下走就ok了
#include <cstdio>
#include <algorithm>
using namespace std;
#define ll long long
struct st {
ll pos[10];
} bao[120];
bool cmp(int x,int y) {
return x<y;
}
ll dis(ll x,ll y)
{
return x>y?(x-y):(y-x);
}
int main() {
int n,k;
scanf ("%d%d",&n,&k);
for (int i=1; i<=n; i++)
for (int j=1; j<=k; j++)
scanf ("%lld",&bao[i].pos[j]);
for (int i=1; i<=n; i++)
sort(bao[i].pos+1,bao[i].pos+k+1,cmp);
ll ans=0;
for (int i=1; i<=k; i++)
for (int j=2; j<=n; j++){
ans+=dis(bao[j].pos[i],bao[j-1].pos[i]);
}
printf ("%lld\n",ans);
return 0;
}