poj1723 Soldiers(中位数)
题目链接
题意
给出n个点的坐标,它们只能往上、下、左、右一格一格地移动,求使其移动至水平线上的最小步数。
题解
因为我们最终安排的纵坐标是固定的,设纵坐标为yyyyyy,那么我们希望min∣y[i]−yy∣\min |y[i]-yy|min∣y[i]−yy∣,这是一个货仓选址问题,yyyyyy取y[N]y[N]y[N]中位数的时候该值最小。
sort(y, y + N);if (N % 2 == 1)yy = y[N / 2];else yy = (y[N / 2 - 1] + y[N / 2]) / 2;for (int i = 0; i < N; i++)res += abs(double(y[i] - yy));
然后确定xxx的开始位置xxxxxx,使得所有的点排列到(xx,y),(xx+1,y)...(xx,y),(xx+1,y)...(xx,y),(xx+1,y)...,因此我们按照x[i]x[i]x[i]从小到达排序,希望最小化min∣x[i]−(xx+i)∣→min∣(x[i]−i)−xx∣\min {|x[i]-(xx+i)|}\rightarrow\min {|(x[i]-i)-xx|}min∣x[i]−(xx+i)∣→min∣(x[i]−i)−xx∣,将原数组中的每一项x[i]−=ix[i]-=ix[i]−=i,这就变成了一个等价的货仓选址问题,xxxxxx是数组{x[i]−i}\{x[i]-i\}{x[i]−i}的中位数。
sort(x, x + N);for (int i = 0; i < N; i++)x[i] -= i;sort(x, x + N);if (N % 2 == 1)xx = x[N / 2];else xx = (x[N / 2 - 1] + x[N / 2]) / 2;for (int i = 0; i < N; i++)res += abs(double(x[i] - xx));
然后统计结果即可
#define ll long long
#define vec vector<int>
#define P pair<int,int>
#define inf 0x3f3f3f3f
#define MAX 10005int N, x[MAX], y[MAX];int main() {while (scanf("%d", &N) != EOF) {for (int i = 0; i < N; i++)scanf("%d %d", &x[i], &y[i]);int xx, yy, res = 0;sort(x, x + N);for (int i = 0; i < N; i++)x[i] -= i;sort(x, x + N);if (N % 2 == 1)xx = x[N / 2];else xx = (x[N / 2 - 1] + x[N / 2]) / 2;for (int i = 0; i < N; i++)res += abs(double(x[i] - xx));sort(y, y + N);if (N % 2 == 1)yy = y[N / 2];else yy = (y[N / 2 - 1] + y[N / 2]) / 2;for (int i = 0; i < N; i++)res += abs(double(y[i] - yy));printf("%d\n", res);}
}
poj1723 Soldiers(中位数)相关推荐
- POJ1723 Soldiers 中位数
题目链接 http://poj.org/problem?id=1723 分析 求排成一行的最少操作步数,其横坐标的相对位置肯定不变. 设从 x0x_0x0 往后排,则使横坐标符合要求的操作步数为 ∑ ...
- POJ 1723 Soldiers (中位数)
$ POJ~1723~Soldiers $ (中位数) $ solution: $ 这道题说难也不算太难,但是当时自己想的很矛盾.所以还是列一篇题解. 这道题首先比较容易看出来的就是:行和列是两个分开 ...
- poj1723 SOLDIERS(思维题-中位数/货仓选址问题)
题目 n(n<=1e4)个士兵,第i个士兵的位置(xi,yi),-1e4<=xi,yi<=1e4 把士兵安排到同一条水平线上,使之在竖直方向n个士兵相邻 最后排成(x,y),(x+1 ...
- poj1723 SOLDIERS
看错题了无语...还以为只要在一排并且每个位置最多为1个士兵就可以... 原来是(x,y), (x+1,y), ..., (x+N-1,y), y取中点,x先减i,再去中点. 就是贪心- #inclu ...
- ACM基础与精选2018
会津大学基础题 AOJ0001 List of Top 3 Hills[水题] AOJ0002 Digit Number[水题] AOJ0005 GCD and LCM[GCD+LCM] AOJ000 ...
- $2019$ 暑期刷题记录 $2$(基本算法专题)
$ 2019 $ 暑期刷题记录 $ 2 $ (基本算法专题) $ by~~wch $ $ BZOJ~1958~Strange~Towers~of~Hanoi $ (动态规划,递推) 题目大意: 求有 ...
- 《算法竞赛进阶指南(by 李煜东)》习题题解 集合
又是笔者给自己挖的大坑. 这里是李煜东所著<算法竞赛进阶指南(by 李煜东)>的习题题解集合. 有任何错误请在对应文章下反馈或联系 nicest1919@163.com ,谢谢 qwq 从 ...
- 【POJ1723】SOLDIERS(中位数,货仓选址)
problem 平面上有N(N<=10000)个点 求这些点变成一条水平线的最小移动步数 solution 对于y轴,易证得在中位数处取到最优,直接排序统计即可. 对于x轴,因为要保证相对顺序, ...
- 【POJ 1723】SOLDIERS(排序、中位数)
题面:SOLDIERS 题目大意 有 nnn 个士兵,并且知道每个士兵在二维坐标图上的位置. 士兵可以进行移动,但是每个士兵每次只能向上.向下.向左或向右移动一个单位,因此,他的 xxx 或 yyy ...
最新文章
- 关于NLP相关技术全部在这里:预训练模型、图神经网络、模型压缩、知识图谱、信息抽取、序列模型、语法分析、文本处理...
- Linux的权限管理
- 第二弹:超全Python学习资源整理(进阶系列)
- 单片机c语言 u16,单片机C语言的误用
- java登录界面命令_Java命令行界面(第7部分):JCommander
- Linux 系统服务管理(启动服务/停止服务/重启服务)的命令 - chkconfig/service/systemctl
- mysql的每隔1分钟定时_简单易用,spring boot集成quartz,实现分布式定时任务
- oracle数据库并行数限制,Oracle数据库并行处理技术详解(上)
- 第十一篇:稳定性之面向失败设计【过载保护】
- python写入Excel时,将路径或链接以超链接的方式写入
- 下载文件根据浏览器判断文件名,解决兼容性问题
- 火狐firebug,firepath以及Selenium IDE插件安装方法
- Python库pygame下载教程
- c语言基础课程包括啥,推荐收藏!C语言入门基础知识大全
- 树莓派chromium-os系统发布
- 2020智能营销领域最具商业合作价值企业盘点
- VUE + ONLYOFFICE
- Ubuntu将文件夹切换为英文
- MFC——画笔和画刷
- 【无人机】【2011】直升机无人机的最优控制