poj1723
来源:互联网 发布:mac没有host 编辑:程序博客网 时间:2024/06/03 14:58
poj1723
先把所有的士兵移动到y= 的一条水线上(关键是找中位数,和王晓东的算法设计与分析2-1一样,求所有y坐标到中位数的和,可以排序后一下求出,但我的代码中不是这样求的),然后再考虑如何移动士兵使其挨着又不同时在一个位置。
比如排列在a, a+1, a+2, a+3,.....
先把横坐表从小到大排序sort();
x[i] -> a+i; 在x[i]位置的士兵移动到 a + i;
计算移动距离:x[i] - (a + i) 0<= i < n; (n个士兵)
转化为 对(x[i] - i)- a 0 <= i < n 求和。相当于求(x[i] - i)到中位数的距离和。
把水平竖直两方向的移动距离加到一起就好了。zzuwenjie 2017-3-11 12:06:28
#include <cstdio>#include <iostream>#include <cstring>#include <algorithm>using namespace std;const int maxn = 20000+7;int arrayNum[maxn];int x[10000+7];int y[10000+7];int main(){ int n; while (~scanf("%d", &n)){ memset(arrayNum, 0, sizeof arrayNum); for (int i = 0; i < n; ++i){ scanf("%d%d",&x[i], &y[i]); arrayNum[y[i] + 10000]++; } int mid = (n + 1) / 2, midNum = 0; for (int i = 20000; i >= 0; --i){ mid -= arrayNum[i]; if (mid <= 0){ midNum = i - 10000; break; } } int sum = 0; sort(x, x + n); for (int i = 0; i < n; ++i){ x[i] -= i; } sort(x, x + n); int midNUmX = x[n / 2]; //cout <<"start = " << start << endl; for (int i = 0; i < n; ++i){ sum += abs(y[i] - midNum) + abs(x[i] - midNUmX); } printf("%d\n", sum); } return 0;}
0 0
- poj1723
- poj1723
- poj1723
- poj1723
- poj1723
- poj1723(排序)
- POJ1723----SOLDIERS
- poj1723(士兵移动)
- poj1723 排序+中位数
- poj1723 中位数的应用
- POJ1723.SOLDIERS 排序+思维
- POJ1723 SOLDIERS【中位数+排序】
- POJ1723,SOLDIERS,纯数学,猜想+证明
- 面试题之中位数的应用POJ1723
- ACM: 一道水题 poj1723
- 分治算法---poj1723【士兵排队】Soldier
- 分治算法--士兵排队(poj1723)
- vue 学习笔记二之vue2与vue1的选择
- ieee-explore文献免费下载办法
- 我在CSDN上的第一篇博客
- 常见的面向对象设计原则
- A值与B值的交换方法
- poj1723
- bzoj4390 Max Flow
- Search Insert Position问题及解法
- gnu sort命令的--general-numeric-sort选项与--numeric-sort选项区别
- 策略模式
- 自学Android之Activity:(五)Activity启动模式
- 炫酷的ViewPager翻页动画
- JavaScript基础知识(10)
- Untiy之Android平台读写遇到的坑