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,再次排序后求中位数即可。
程序说明:(略)
题记:(略)
问题简述:有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; }
相关文章推荐
- POJ - 1723 Soldiers 士兵站队 排序+中位数
- POJ1723 SOLDIERS【中位数+排序】
- poj1723 排序+中位数
- poj 1723 SOLDIERS 中位数
- POJ 1723 SOLDIERS (中位数)
- poj 1723 SOLDIERS 中位数
- POJ 1723 SOLDIERS 【排序】
- poj 1723 Soldiers【中位数】By cellur925
- POJ 1723 SOLDIERS(水~)
- poj 1723 SOLDIERS
- POJ 2388:Who's in the Middle:快速排序思想求解中位数
- OpenJudge/Poj 1723 SOLDIERS
- POJ-1723 中位数
- poj 1723 SOLDIERS 带权中位数
- poj 1723 中位数
- POJ--1723--SOLDIERS
- poj1723(排序)
- POJ 1723 SOLDIERS
- POJ 2388 Who's in the Middle(水~奇数个数排序求中位数)
- SOLDIERS(POJ 1723)