G.寻宝(贪心)

寻宝

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;
}

猜你喜欢

转载自blog.csdn.net/qq_43906000/article/details/88256204