POJ 1723 SOLDIERS (中位数)
2016-01-09 11:44
218 查看
题目大意:
平面上有N(N<=10000)个点,求这些点变成一条水平线的最小移动步数。
算法讨论:
表示自己太弱弱了,打算从今天开始提高一下智商。
我们考虑,既然是要成一条水平线,那么这条直线的y坐标肯定是所有y的中位数了。这是不用置疑的。所以我们只要求出中位数,然后对y坐标的距离差求下和就可以了。
对于x坐标,我们这样考虑,既然题目要求是最小步数,那么也就是说,这些博士兵在水平位置上的相对位置不变,换个意思说就是 原来三个士兵的x坐标是 -1 5 6,那么在他们移动之后,假设移动成一条直线之后,起点是原来-1的那个士兵,现在的坐标是9,那么他们之间的相对位置就是9 10 11...
那么,这样来说,我们就可以这样想:假设最后水平线的起点是a,根据上面的理论可以得到 x'[0] = a, x'[1] = a+1, x'[2] = a+2...
移项,可以得到x[0] - 0 = a, x[1] - 1 = a, x[2] - 2 = a.....
所以我们把每个x[i] 都减去i,然后再从小到大排序,这样就保证在相对位置不变的情况下成一条水平线。然后把距离差求和就可以了。
还值得一提的,下标从0开始的时候,mid = n / 2, 从1 开始的时候, mid = n / 2 + 1。。。。也是诡异。
Codes:
POJ 1723
平面上有N(N<=10000)个点,求这些点变成一条水平线的最小移动步数。
算法讨论:
表示自己太弱弱了,打算从今天开始提高一下智商。
我们考虑,既然是要成一条水平线,那么这条直线的y坐标肯定是所有y的中位数了。这是不用置疑的。所以我们只要求出中位数,然后对y坐标的距离差求下和就可以了。
对于x坐标,我们这样考虑,既然题目要求是最小步数,那么也就是说,这些博士兵在水平位置上的相对位置不变,换个意思说就是 原来三个士兵的x坐标是 -1 5 6,那么在他们移动之后,假设移动成一条直线之后,起点是原来-1的那个士兵,现在的坐标是9,那么他们之间的相对位置就是9 10 11...
那么,这样来说,我们就可以这样想:假设最后水平线的起点是a,根据上面的理论可以得到 x'[0] = a, x'[1] = a+1, x'[2] = a+2...
移项,可以得到x[0] - 0 = a, x[1] - 1 = a, x[2] - 2 = a.....
所以我们把每个x[i] 都减去i,然后再从小到大排序,这样就保证在相对位置不变的情况下成一条水平线。然后把距离差求和就可以了。
还值得一提的,下标从0开始的时候,mid = n / 2, 从1 开始的时候, mid = n / 2 + 1。。。。也是诡异。
Codes:
#include <cstdio> #include <iostream> #include <cstring> #include <cstdlib> #include <algorithm> using namespace std; const int N = 10000 + 5; typedef long long ll; int n, mid; int x , y ; ll step_x = 0, step_y = 0; int main(){ while(~scanf("%d", &n)){ mid = n / 2 + 1; step_x = step_y = 0; for(int i = 1; i <= n; ++ i) scanf("%d%d", &x[i], &y[i]); sort(y + 1, y + n + 1); for(int i = 1; i <= n; ++ i) step_y += abs(y[i] - y[mid]); sort(x + 1, x + n + 1); for(int i = 1; i <= n; ++ i) x[i] -= i; sort(x + 1, x + n + 1); for(int i = 1; i <= n; ++ i) step_x += abs(x[i] - x[mid]); printf("%lld\n", (ll) step_x + step_y); } return 0; }
POJ 1723
相关文章推荐
- 操作系统课程设计 线程的同步与互斥
- 如何更改应用程序加载基地址
- php异步调用客服消息,总是重复三条
- UITableViewCell左侧会有默认15像素的空白
- WIN10下配置java jdk
- ROS学习笔记(1):在ROS中使用OpenCV进行简单的图象处理--原理篇
- 【原创】生活中的算法
- GCC 编译过程及每个过程做了那些事(收集)
- Mongodb 笔记03 查询、索引
- Java的Unsafe类
- 【HDU】 1548 A strange lift
- 华为机试——字符串加解密
- Linux shortcut
- 压力测试 mac ab
- 配置监控宝 监控服务器性能
- Struts2属性驱动封装(了),需要使用ognl表达式
- 华为机试——查找兄弟单词
- 输出顺时针旋转的数组
- 【转】HTTP Live Streaming直播(iOS直播)技术分析与实现
- 【数组】Maximum Subarray