3625 codevs 士兵站队问题 中位数的妙用
在一个划分成网格的操场上,n个士兵散乱地站在网格点上。网格点用整数坐标(x,y)表示。士兵们可以沿网格边往上、下、左、右移动一步,但在同一时刻任一网格点上只能有一名士兵。按照军官的命令,士兵们要整齐地列成一个水平队列,即排列成(x,y),(x+1,y),…,(x+n-1,y)。如何选择x和y的值才能使士兵们以最少的总移动步数排成一行。编程计算使所有士兵排成一行需要的最少移动步数。
第1行是士兵数n,1≤n≤10000。接下来n行是士兵的初始位置,每行有2个整数x和y,-10000≤x,y≤10000。
一个数据,即士兵排成一行需要的最少移动步数。
5
1 2
2 2
1 3
3 -2
3 3
8
-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 士兵站队问题 中位数的妙用的更多相关文章
- 洛谷 P1889 士兵站队
P1889 士兵站队 题目描述 在一个划分成网格的操场上, n个士兵散乱地站在网格点上.由整数 坐标 (x,y) 表示.士兵们可以沿网格边上.下左右移动一步,但在同时刻任一网格点上只能有名士兵.按照军 ...
- 洛谷P1889 士兵站队
题目描述 在一个划分成网格的操场上, n个士兵散乱地站在网格点上.由整数 坐标 (x,y) 表示.士兵们可以沿网格边上.下左右移动一步,但在同时刻任一网格点上只能有名士兵.按照军官的命令,们要整齐地列 ...
- 士兵站队问题sol
作者:http://www.cnblogs.com/taoziwel/articles/1859577.html 相类似题目:输油管道问题 [问题描述] 在一个划分成网格的操场上,n个士兵散乱地站在网 ...
- LFYZ-OJ ID: 1017 士兵站队问题
分析 该题和"输油管道问题"类似,只不过由一维问题编程了二维问题.可以将总步数分解为移动到水平线y位置的总步数ysteps和移动到序列x, x+1, x+2, ... , x+n- ...
- codevs与noi做题改错本目录
从2016.2.13开始: 1. 排序超时的问题---------目录:-测试习题 2. 超高精度乘法超时问题-----------目录:高精度计算 算法:快速傅里叶算法. 压位算法 3. 高精度 ...
- poj 1723 Soldiers【中位数】By cellur925
题目传送门 题目大意:平面上有n个士兵,给出每个士兵的坐标,求出使这些士兵站好所需要的最少移动步数.站好要求:所有士兵y相等,x相邻.即达到 (x,y), (x+1, y), (x+2,y)……的状态 ...
- 【CJOJ P2110】YL杯超级篮球赛
[CJOJ P2110]YL杯超级篮球赛 Description 一年一度的高一YL杯超级篮球赛开赛了.当然,所谓超级的意思是参赛人数可能多于5人.小三对这场篮球赛非常感兴趣,所以一场都没有落下.每天 ...
- Alignment--POJ1836
Description In the army, a platoon is composed by n soldiers. During the morning inspection, the sol ...
- [SinGuLaRiTy] 分治题目复习
[SInGuLaRiTy-1025] Copyrights (c) SinGuLaRiTy 2017. All Rights Reserved. [POJ 1905] 棍的膨胀 (Expanding ...
随机推荐
- SpringBoot AOP控制Redis自动缓存和更新
导入redis的jar包 <!-- redis --> <dependency> <groupId>org.springframework.boot</gro ...
- mysql配置文件生效顺序
安装完数据库 除了将my.cnf放在/etc/下放在其他地方也是可以的 cp /usr/share/mysql/my-default.cnf /etc/my.cnf 今天就看一下这些my.cnf是怎么 ...
- 部署私有云网盘owncloud
环境说明: [root@localhost ~]# cat /etc/redhat-release CentOS release 6.9 (Final) [root@localhost ~]# una ...
- 《Pro Git》第1章 起步
关于版本控制 什么是版本控制:记录文件内容变化,将来可查阅特定版本修订情况的系统. 版本控制演进 1)本地版本控制系统 2)集中化的版本控制系统(Centralized Version Control ...
- MongoError: server instance in invalid state undefined 解决办法
MongoDB关键点集锦(更新中...) 2017-01-20 09:33:48[其它数据库]点击数:15作者:Real_Bird的博客来源: 网络 随机为您推荐的文章:MongDB索引的介绍及使用 ...
- mysql数据库优化课程---11、mysql普通多表查询
mysql数据库优化课程---11.mysql普通多表查询 一.总结 一句话总结:select user.username,user.age,class.name,class.ctime from u ...
- Codeforces Round #250 (Div. 2)D
给你一张无向图,每个点有一个权值,对于一条从l到r 的边权值是l到r路径上最小的点的权值,(多条路取最大的权值),然后求每两个点之间的权值和/点对数 题解:并查集维护,先从点大的边排序,然后依次加边, ...
- 转:oracle驱动表
以一个比较两本字典来做例子: 一本字典有索引目录(dict a), 一本没有(dict b) 现在要找出所有a开头的单词的异同 那么比较的时候,你会怎么比较? ...
- 22-THREE.JS 面材质
<!DOCTYPE html> <html> <head> <title>Example 04.05 - Mesh face material</ ...
- java中商业数据计算时用到的类BigDecimal和DecimalFormat
1.引言 借用<Effactive Java>这本书中的话,float和double类型的主要设计目标是为了科学计算和工程计算.他们执行二进制浮点运算,这是为了在广域数值范围上提供较为精确 ...