士兵站队问题
题目描述 Description

在一个划分成网格的操场上,n个士兵散乱地站在网格点上。网格点用整数坐标(x,y)表示。士兵们可以沿网格边往上、下、左、右移动一步,但在同一时刻任一网格点上只能有一名士兵。按照军官的命令,士兵们要整齐地列成一个水平队列,即排列成(x,y),(x+1,y),…,(x+n-1,y)。如何选择x和y的值才能使士兵们以最少的总移动步数排成一行。编程计算使所有士兵排成一行需要的最少移动步数。

输入描述 Input Description

第1行是士兵数n,1≤n≤10000。接下来n行是士兵的初始位置,每行有2个整数x和y,-10000≤x,y≤10000。

输出描述 Output Description

一个数据,即士兵排成一行需要的最少移动步数。

样例输入 Sample Input

5

1 2

2 2

1 3

3 -2

3 3

样例输出 Sample Output

8

数据范围及提示 Data Size & Hint

-10000≤x,y≤10000

代码如下:

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<algorithm>
using namespace std;
int x[10009],y[10009];
int main()
{
int n,sx=0,sy=0;
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d%d",&x[i],&y[i]);
sort(x,x+n);
sort(y,y+n);
for(int i=0;i<n;i++)
{x[i]-=i;}
sort(x,x+n);
for(int i=0;i<n;i++)
{
sx+=abs(x[i]-x[n/2]);
sy+=abs(y[i]-y[n/2]);
}
cout<<sx+sy<<endl;
return 0;
}

思路解析:

士兵站队,要站在同一排,且一个点只有一个士兵。

士兵要先统一y轴,即士兵移动后纵坐标相等,然后移动x轴使其分散开;

一、统一y轴的最优方法

设目标坐标为M,即n个士兵最终需要移动到的Y轴的坐标值为M
n个士兵的Y轴坐标分别为:
Y0,Y1,Y2 …… …… Yn-1
则最优步数S=|Y0-M|+|Y1-M|+|Y2-M|+ …… …… +|Yn-1-M|;

那么m取何数值时,会发现当m为纵坐标排序后的中位数时s最小。接下来给予证明

|a|-|b|≤|a+(或者是相减)b|≤|a+b|≤|a|+|b|(不做证明了)

例如(假设有两个士兵,我们从简单的开始讨论)

则 s=|y0-m|+|y1-m|,可转换为 s=|m-y0|+|y1-m|;

两个绝对值相加,我们可以用开始的公式消去m;

则 |m-y0|+|y1-m| ≥ |y1-y0|;

那么何时 |m-y0|+|y1-m| = |y1-y0|取得最小呢?

可发现 当绝对值号中符号相同时 可取得最小,令其都大于0

则            y0<m<y1;

可想 当m在两个士兵纵坐标之间时 无论怎么移动 两个士兵移动的距离和 都是两个士兵之间的距离

所以S=|Y0-M|+|Y1-M|+|Y2-M|+ …… …… +|Yn-1-M|对于这个公式使前一半绝对值号内交换位置,都令其大于零,消去M,最后会发现M就是士兵排序之后纵坐标的中位数

二、同统一y轴的方法

设,士兵需要移动到的“最终位置”的X轴坐标值为:k,k+1,k+2 …… …… k+(n-1)

则所求最优步数S=|X0-k|+|X1- (k+1) |+|X2-(k+2)|+ …… +|Xn-1-(k+(n-1))|

经过变形S=|X0-k|+|(X1-1)-k|+|(X2-2)-k|+ …… …… +|(Xn-1-(n-1))-k|

k的取值同理是其中位数;

注意:x轴先从小到大排序之后,在依次减0-- n-1,再排序,再找中位数。

3625 codevs 士兵站队问题 中位数的妙用的更多相关文章

  1. 洛谷 P1889 士兵站队

    P1889 士兵站队 题目描述 在一个划分成网格的操场上, n个士兵散乱地站在网格点上.由整数 坐标 (x,y) 表示.士兵们可以沿网格边上.下左右移动一步,但在同时刻任一网格点上只能有名士兵.按照军 ...

  2. 洛谷P1889 士兵站队

    题目描述 在一个划分成网格的操场上, n个士兵散乱地站在网格点上.由整数 坐标 (x,y) 表示.士兵们可以沿网格边上.下左右移动一步,但在同时刻任一网格点上只能有名士兵.按照军官的命令,们要整齐地列 ...

  3. 士兵站队问题sol

    作者:http://www.cnblogs.com/taoziwel/articles/1859577.html 相类似题目:输油管道问题 [问题描述] 在一个划分成网格的操场上,n个士兵散乱地站在网 ...

  4. LFYZ-OJ ID: 1017 士兵站队问题

    分析 该题和"输油管道问题"类似,只不过由一维问题编程了二维问题.可以将总步数分解为移动到水平线y位置的总步数ysteps和移动到序列x, x+1, x+2, ... , x+n- ...

  5. codevs与noi做题改错本目录

    从2016.2.13开始: 1.  排序超时的问题---------目录:-测试习题 2.  超高精度乘法超时问题-----------目录:高精度计算 算法:快速傅里叶算法. 压位算法 3. 高精度 ...

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

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

  7. 【CJOJ P2110】YL杯超级篮球赛

    [CJOJ P2110]YL杯超级篮球赛 Description 一年一度的高一YL杯超级篮球赛开赛了.当然,所谓超级的意思是参赛人数可能多于5人.小三对这场篮球赛非常感兴趣,所以一场都没有落下.每天 ...

  8. Alignment--POJ1836

    Description In the army, a platoon is composed by n soldiers. During the morning inspection, the sol ...

  9. [SinGuLaRiTy] 分治题目复习

    [SInGuLaRiTy-1025] Copyrights (c) SinGuLaRiTy 2017. All Rights Reserved. [POJ 1905] 棍的膨胀 (Expanding ...

随机推荐

  1. jQuery上下切换带缩略图的焦点图

    在线演示 本地下载

  2. VRChat简易教程3-往世界里导入模型和VRC接口初探

    一.准备工作 按前面的教程新建一个project,导入sdk并创建地面(Terrain)和VRCWorld. 本教程中我们学习如何导入别人做好的模型并使用VRC提供的接口来实现物品的抓取,模型素材(小 ...

  3. React生命周期及事件详解

    引用原文:http://blog.csdn.net/limm33/article/details/50942808 一.组件的详细说明和生命周期ComponentSpecs and Lifecycle ...

  4. SElinux 读懂.te 定义自己的 .te【转】

    本文转载自:https://blog.csdn.net/kongbaidepao/article/details/61417291 一. .te 文件定义中的一些宏 1.1 unix_socket_c ...

  5. 偶然发现有的IIS里的程序,连接 不上SQL Server数据库, 超时

    经查应用程序池中, 有一个启用32位应用程序,  有时打开它就能连接上SQL SERVER了.

  6. NSwag Tutorial: Integrate the NSwag toolchain into your ASP.NET Web API project

    https://blog.rsuter.com/nswag-tutorial-integrate-the-nswag-toolchain-into-your-asp-net-web-api-proje ...

  7. Python学习(二)——深度学习入门介绍

    课程二:深度学习入门 讲师:David (数据分析工程师) 这门课主要介绍了很多神经网络的基本原理,非常非常基础的了解. 零.思维导图预览:                一.深度神经网络 1.神经元 ...

  8. tomcat配置访问图片路径映射到磁盘路径

    首先,我在调试页面的时候发现,图片路径为: /webapps/pic_son/img/1234565456.jpg 但是,tomcat中webapps的文件夹下的pic_son项目中,img文件夹是空 ...

  9. ButterKnife使用详谈

    (1)ButterKnife是什么? 在开发过程中,我们总是会写大量的findViewById和点击事件,像初始view.设置view监听这样简单而重复的操作让人觉得特别麻烦,当然不会偷懒的程序员不是 ...

  10. Codeforces Round #423 (Div. 1, rated, based on VK Cup Finals)

    Codeforces Round #423 (Div. 1, rated, based on VK Cup Finals) A.String Reconstruction B. High Load C ...