题目链接

题意

给出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(中位数)相关推荐

  1. POJ1723 Soldiers 中位数

    题目链接 http://poj.org/problem?id=1723 分析 求排成一行的最少操作步数,其横坐标的相对位置肯定不变. 设从 x0x_0x0​ 往后排,则使横坐标符合要求的操作步数为 ∑ ...

  2. POJ 1723 Soldiers (中位数)

    $ POJ~1723~Soldiers $ (中位数) $ solution: $ 这道题说难也不算太难,但是当时自己想的很矛盾.所以还是列一篇题解. 这道题首先比较容易看出来的就是:行和列是两个分开 ...

  3. poj1723 SOLDIERS(思维题-中位数/货仓选址问题)

    题目 n(n<=1e4)个士兵,第i个士兵的位置(xi,yi),-1e4<=xi,yi<=1e4 把士兵安排到同一条水平线上,使之在竖直方向n个士兵相邻 最后排成(x,y),(x+1 ...

  4. poj1723 SOLDIERS

    看错题了无语...还以为只要在一排并且每个位置最多为1个士兵就可以... 原来是(x,y), (x+1,y), ..., (x+N-1,y), y取中点,x先减i,再去中点. 就是贪心- #inclu ...

  5. ACM基础与精选2018

    会津大学基础题 AOJ0001 List of Top 3 Hills[水题] AOJ0002 Digit Number[水题] AOJ0005 GCD and LCM[GCD+LCM] AOJ000 ...

  6. $2019$ 暑期刷题记录 $2$(基本算法专题)

    $ 2019 $ 暑期刷题记录 $ 2 $ (基本算法专题) $ by~~wch $ $ BZOJ~1958~Strange~Towers~of~Hanoi $ (动态规划,递推) 题目大意: 求有 ...

  7. 《算法竞赛进阶指南(by 李煜东)》习题题解 集合

    又是笔者给自己挖的大坑. 这里是李煜东所著<算法竞赛进阶指南(by 李煜东)>的习题题解集合. 有任何错误请在对应文章下反馈或联系 nicest1919@163.com ,谢谢 qwq 从 ...

  8. 【POJ1723】SOLDIERS(中位数,货仓选址)

    problem 平面上有N(N<=10000)个点 求这些点变成一条水平线的最小移动步数 solution 对于y轴,易证得在中位数处取到最优,直接排序统计即可. 对于x轴,因为要保证相对顺序, ...

  9. 【POJ 1723】SOLDIERS(排序、中位数)

    题面:SOLDIERS 题目大意 有 nnn 个士兵,并且知道每个士兵在二维坐标图上的位置. 士兵可以进行移动,但是每个士兵每次只能向上.向下.向左或向右移动一个单位,因此,他的 xxx 或 yyy ...

最新文章

  1. 关于NLP相关技术全部在这里:预训练模型、图神经网络、模型压缩、知识图谱、信息抽取、序列模型、语法分析、文本处理...
  2. Linux的权限管理
  3. 第二弹:超全Python学习资源整理(进阶系列)
  4. 单片机c语言 u16,单片机C语言的误用
  5. java登录界面命令_Java命令行界面(第7部分):JCommander
  6. Linux 系统服务管理(启动服务/停止服务/重启服务)的命令 - chkconfig/service/systemctl
  7. mysql的每隔1分钟定时_简单易用,spring boot集成quartz,实现分布式定时任务
  8. oracle数据库并行数限制,Oracle数据库并行处理技术详解(上)
  9. 第十一篇:稳定性之面向失败设计【过载保护】
  10. python写入Excel时,将路径或链接以超链接的方式写入
  11. 下载文件根据浏览器判断文件名,解决兼容性问题
  12. 火狐firebug,firepath以及Selenium IDE插件安装方法
  13. Python库pygame下载教程
  14. c语言基础课程包括啥,推荐收藏!C语言入门基础知识大全
  15. 树莓派chromium-os系统发布
  16. 2020智能营销领域最具商业合作价值企业盘点
  17. VUE + ONLYOFFICE
  18. Ubuntu将文件夹切换为英文
  19. MFC——画笔和画刷
  20. 【无人机】【2011】直升机无人机的最优控制

热门文章

  1. IVI车载信息娱乐系统的网络安全注意事项
  2. SpringCloud断路器的作用及使用?
  3. matlab-高数 subs 求导数后求值
  4. Cinema Director 教程——unity制作过程动画,剧情等
  5. DDR信号完整性仿真介绍
  6. obsidian 多设备文件同步配置,不需要 iCloud,使用 webdav
  7. linux源码剖析四 built-in.o 文件编译生成过程
  8. 熬汗旗新会中学2021高考成绩查询,关于给2021届高考生高考励志祝福语文案
  9. Flink kafka 数据转成自己需要的实体类
  10. 在特斯拉和蔚来自燃之后,比亚迪也自燃了……