题目大意:

平面上有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 = + ;
typedef long long ll; int n, mid;
int x[N], y[N];
ll step_x = , step_y = ; int main(){
while(~scanf("%d", &n)){
mid = n / + ;
step_x = step_y = ;
for(int i = ; i <= n; ++ i)
scanf("%d%d", &x[i], &y[i]); sort(y + , y + n + );
for(int i = ; i <= n; ++ i) step_y += abs(y[i] - y[mid]);
sort(x + , x + n + );
for(int i = ; i <= n; ++ i) x[i] -= i;
sort(x + , x + n + );
for(int i = ; i <= n; ++ i) step_x += abs(x[i] - x[mid]); printf("%lld\n", (ll) step_x + step_y);
} return ;
}

POJ 1723

POJ 1723 SOLDIERS (中位数)的更多相关文章

  1. poj 1723 SOLDIERS 带权中位数

    题目 http://poj.org/problem?id=1723 题解 带权中位数类型的题目~ 可以先考虑降维,最后集合的y坐标,明显是y坐标的中位数的位置,容易求出y方向的贡献res_y.比较麻烦 ...

  2. poj 1723 Soldiers【中位数】By cellur925

    题目传送门 题目大意:平面上有n个士兵,给出每个士兵的坐标,求出使这些士兵站好所需要的最少移动步数.站好要求:所有士兵y相等,x相邻.即达到 (x,y), (x+1, y), (x+2,y)……的状态 ...

  3. OpenJudge/Poj 1723 SOLDIERS

    1.链接地址: http://bailian.openjudge.cn/practice/1723/ http://poj.org/problem?id=1723 2.题目: 总时间限制: 1000m ...

  4. POJ 1723 SOLDIERS

    SOLDIERS Time Limit: 1000ms Memory Limit: 10000KB This problem will be judged on PKU. Original ID: 1 ...

  5. poj 1723 中位数

    最近在看一些中位数的东西,然后顺便也看了些题目.poj 1723不仅要求到水平位置的最短距离和,还要求水平都相邻的排成一排的最短距离和,即士兵都站成一列. 到y轴的距离好办,按y轴坐标排序,求中位数, ...

  6. 【POJ 1723】 SOLDIERS

    [题目链接] http://poj.org/problem?id=1723 [算法] 中位数 [代码] #include <algorithm> #include <bitset&g ...

  7. [POJ1723]SOLDIERS(中位数)

    题意 给出n个点的坐标,它们只能往上.下.左.右一格一格地移动,求使其移动至水平线上的最小步数. 思路 转载 先易后难,对于纵向的问题,我们推个公式,,这个很容易看出是货仓选址问题,k取y[i]的中位 ...

  8. POJ 1723

    #include <iostream> #include <algorithm> #define MAXN 10005 using namespace std; struct ...

  9. POJ 2388 Who's in the Middle(水~奇数个数排序求中位数)

    题目链接:http://poj.org/problem?id=2388 题目大意: 奇数个数排序求中位数 解题思路:看代码吧! AC Code: #include<stdio.h> #in ...

随机推荐

  1. 内存管理pbuf.c源码解析——LwIP学习

    声明:个人所写所有博客均为自己在学习中的记录与感想,或为在学习中总结他人学习成果,但因本人才疏学浅,如果大家在阅读过程中发现错误,欢迎大家指正. 本文自己尚有认为写的不完整的地方,源代码没有完全理清, ...

  2. ifstream中文路径问题分析

    最近维护一个项目,遇到了ifstream在中文路径下打开文件失败的bug,我搜索了一下,最后整理成下文以后日后查阅. 一.问题重现 vs2008下创建一个简单win32工程. 使用ANSI编码方式:项 ...

  3. VC:CString用法整理(转载)

    1.CString::IsEmpty BOOL IsEmpty( ) const; 返回值:如果CString 对象的长度为0,则返回非零值:否则返回0. 说明:此成员函数用来测试一个CString ...

  4. Oracle11g R2学习系列 之八高级数据类型

    所谓的高级数据类型,就是大数据类型,即BCNB(助记词:BC牛逼)+XML数据类型. B:blob,用来存储可变长度的二进制数据. C:clob,主要用来存储可变长度的字符型数据,也就是其他数据库中提 ...

  5. JavaScript语法支持严格模式:"use strict"

    如果给JavaScript代码标志为“严格模式”,则其中运行的所有代码都必然是严格模式下的.其一:如果在语法检测时发现语法问题,则整个代码块失效,并导致一个语法异常.其二:如果在运行期出现了违反严格模 ...

  6. editor.md实现Markdown编辑器

    editor.md实现Markdown编辑器 Markdown和Editor.md简介 Markdwon编辑器在技术工作者圈子中已经越来越流行,简单的语法,统一的格式,强大的扩展功能,最重要的是:你可 ...

  7. LeetCode_Permutations

    Given a collection of numbers, return all possible permutations. For example, [1,2,3] have the follo ...

  8. 24C01的IIC 讀寫的c51程式

    /*------------------------------------------------------------------------------ 為了安全起見,程式中很多NOP是冗餘的 ...

  9. 【转】Android(4.2) Sensors 学习——G-sensor,Gyroscope驱动移植

    原文网址:http://blog.csdn.net/nxh_love/article/details/11804841 本人对驱动可谓是一点不懂,鉴于公司目前高驱动的人手不够,所以我也只能两眼一抹黑硬 ...

  10. .net 分页案例效果

     ;             )             {                 pageUrl += ) +  && (totalPageCount > step  ...