您的位置:首页 > 其它

POJ1723 SOLDIERS【中位数+排序】

2018-03-12 22:23 363 查看
问题链接:POJ1723 SOLDIERS
问题简述:有N个士兵,每个士兵开始站的坐标是(x,y),现在使得将N个士兵站在同一个水平线(即所有士兵的y坐标相同)并且x坐标相邻,每个士兵每次可以移动一个位置(分别在x和y方向移动)。求出最少的移动步数。
问题分析:
这是一个最优化问题,可以使用中位数计算来解决。x方向和y方向可以分别来考虑。y方向就是一个简单的中位数计算。x方向是坐标相邻,可以先将x位置排序,然后往中间靠,也是一个中位数计算问题。x方向分别移动到a+i的位置,那么士兵就相邻了,即x[i]=a+i,那么x[i]-i=a。用中位数来算的话,首先将x方向进行排序,然后让x[i]=x[i]-i,再次排序后求中位数即可。
程序说明:(略)
题记:(略)
#include "stdafx.h"
#include <cstdio>
#include <string>
#include <iostream>
#include <algorithm>
using namespace std;
#define N 10000
int x
, y
;
int main()
{
int n;
int i;
int mx, my,ans;

cin >> n;
for (i = 0; i < n; i++) {
cin >> x[i];
cin >> y[i];
}

sort(x, x + n);
for (i = 0; i < n; i++)
x[i] -= i;
sort(x, x + n);
sort(y, y + n);
if (n & 1) {
mx = x[n / 2];
my = y[n / 2];
}
else {
mx = (x[n / 2] + x[n/2-1]) / 2;
my = (y[n / 2] + y[n/2-1]) / 2;
}

ans = 0;
for (i = 0; i < n; i++) {
ans += abs(x[i] - mx) + abs(y[i] - my);
}
cout << ans << endl;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: