题目描述

在一个划分成网格的操场上,n个士兵散乱地站在网格点上,由整数坐标 (x,y)表示。

士兵们可以沿网格边上、下、左、右移动一步,但在同时刻任一网格点上只能有 1 名士兵。

按照军官的命令,们要整齐地列成个水平队列,即排成队列,即排成 (x,y),(x+1,y), …,(x+n-1,y)。请求出如何选择 x 和 y 的值才能使士兵们以最少的总移动步数排成一列。

输入格式

输入的第一行是一个整数,代表士兵数 n。

第 2 到 (n + 1) 行,每行 2 个整数,第 (i + 1) 行的整数 xi​,yi​ 代表第 i 个士兵的坐标。

输出格式

输出一行一个整数,代表答案。

输入输出样例

输入 #1

5
1 2
2 2
1 3
3 -2
3 3

输出 #1

8

说明/提示

对于 100% 的数据,保证 1≤n≤10000,−10000≤x,y≤10000。

题目分析

该题目可以理解为首先确定纵坐标 y 的位置,将所有士兵都放在一排上,然后再具体调整横坐标 x 的位置,因此,仅需要计算所有士兵分别在 x 轴方向的移动步数以及在 y 轴方向上的移动步数,最后再将二者相加,即可得到最终的答案。

具体实现步骤

首先对所有士兵的纵坐标 y 进行 sort 升序排序,然后取纵坐标 y 的中位数,这样就可以知道将士兵们移动到哪一纵坐标处所需要在 y 轴方向移动的步数最少,计算 y 轴方向移动总步数。

接下来便是计算士兵在 x 轴方向的移动步数,这里我是遍历循环,分别将最左边的士兵放在初始位置位于中间的士兵的 x 坐标减去 n 处,到将最左边的士兵放在初始位置位于中间的士兵的 x 坐标加上 n / 2 处,计算不同方案的士兵在 x 轴方向的移动总步数的最小值。

最后将二者的步数加在一起,便是答案所得

AC代码及注释

#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;
const int N = 1e4 + 10;
int x[N],y[N];
int main()
{int n;int step = 0;     //定义step变量用于计算移动步数 int m_count = 0; cin >> n;         //输入士兵人数 n for(int i = 0;i < n;i ++){cin >> x[i] >> y[i];    //依次输入每一个士兵的横纵坐标 }sort(x,x + n);   //将士兵位置的横坐标排序 sort(y,y + n);   //将士兵位置的纵坐标排序 int y_mid , x_mid;x_mid = x[n / 2];   //计算横坐标中位数 y_mid = y[n / 2];   //计算纵坐标中位数 for(int i = 0;i < n;i ++){step += fabs(y[i] - y_mid);  //将每一个士兵进行 y 轴方向的移动 }for(int i = x_mid - n;i < x_mid + n/2;i ++){int count = 0;int k = i;for(int j = 0;j < n;j ++){count += fabs(x[j] - k);  //计算士兵 x 轴方向的移动步数 k ++;}if(i == x_mid - n) m_count = count;if(count < m_count) m_count = count;  //取移动步数最小值 }step += m_count;  //将 x 轴方向以及 y 轴方向的移动步数相加 cout << step;     //输出答案总移动步数 return 0;
}

【P1889 士兵站队】(洛谷)相关推荐

  1. 【洛谷OJ】P1862—输油管道问题

    题目背景 听说最近石油危机 所以想到了这题 题目描述 某石油公司计划建造一条由东向西的主要输油管道.该管道要穿过一个有n口油井的油田.从每口油井都要有一条输油管道沿最短路径(或南或北)与主管道相连.如 ...

  2. 二分+BFS——刺杀大使(洛谷 P1902)

    题目选自洛谷P1902 我们在题面中看到了最大值最小 这五个字. 很容易就想到了二分答案. 同时题目涉及图,以及只能从四个方向,所以想到了BFS的解法 将这两种方法一起使用,就得到了答案! 题目描述 ...

  3. 洛谷P1007——独木桥 解法 (C++)

    Hi 又见面了呀 今天来一道洛谷的题 独木桥 先上个题目传送门(点击蓝字即可观看) 注:该博客已在2020年6月24日更新,更新内容:修复了一些由于字体原因导致的错误 题目背景 战争已经进入到紧要时间 ...

  4. c/c++ 洛谷 P1007 独木桥

    题目链接 洛谷 P1007 独木桥 不想戳的看下图 输入输出.样例.及数据范围 解题思路: 仔细考虑会发现,两个人相遇无论转不转身两个人所走的 总路程 都是一样的,那么时间也都一样,所以我们大可让两个 ...

  5. 洛谷P6474荆轲刺秦王

    传送门 upd on 2022.8.17:时隔半年复盘,把标记改成了差分写法,使用了STL队列,进行了码风优化.(为什么当年博客风格如此智障/kk 谁能拒绝一只拥有无CD闪现和大招的荆轲呢. 小明首先 ...

  6. YBTOJ荆轲刺秦洛谷P6474

    YBTOJ荆轲刺秦&&洛谷P6474 题目传送门 思路: 搜索框架很好想,用一个五元组表示搜索状态(x,y,u1,u2,t),意为用u1次隐身,u2次瞬移,花了t时间,来到(x,y). ...

  7. 洛谷P3628DTOJ1220 [APOI2010]特别行动队

    洛谷P3628&&DTOJ1220 [APOI2010]特别行动队 题目 题目描述 输入格式 输出格式 样例 样例输入 样例输出 数据范围与提示 题解 题目 题目描述 原题 你有一支由 ...

  8. 洛谷P5322 [BJOI2019] 排兵布阵 题解

    洛谷P5322 [BJOI2019] 排兵布阵 题解 题意:小 C 正在玩一款排兵布阵的游戏.在游戏中有 n n n 座城堡,每局对战由两名玩家来争夺这些城堡.每名玩家有 m m m 名士兵,可以向第 ...

  9. 洛谷-题解 P2672 【推销员】

    独门思路!链表加优先队列! 这题一望,贪心是跑不掉了,但是我贪心并不好,所以想到了一个复杂一些但思路更保稳的做法 思路: 1 因为是离线操作,所以我们可以倒着求,先求x=n的情况,因为那样直接就知道了 ...

最新文章

  1. 当一个解决方案下面有多个项目时,如果设置启动项?
  2. 杭电1171(01背包求解)
  3. 【js】JSON.stringify 语法实例讲解
  4. python五种调试或排错的方法
  5. Flex4与WebService通信
  6. android 1396x750设计图,移动端的适配|切图|标注
  7. colorkey唇釉是否安全_colorkey空气唇釉,19/支
  8. tomcat web应用_具有可执行Tomcat的独立Web应用程序
  9. 查看目标主机安装的杀毒软件
  10. openwrt uci
  11. IPVS和Nginx两种WRR负载均衡算法详解
  12. 关于idea,双击选中问题
  13. UltraEdit 25注册机及免费破解注册教程(附带工具)
  14. Excel使用VBA自动调整列宽
  15. 搭建Springboot单体项目
  16. Spark总结之RDD(四)
  17. 常见的 App 安全问题
  18. 分享个md生成思维导图的在线工具
  19. 联想主板bios设置u盘启动项的方法怎么操作
  20. 快捷键----------快人快语

热门文章

  1. Aspose.PDF 23.1.0 for .NET Crack
  2. 嵌入式C语言之零碎知识
  3. 计算机硬件工程师需要学哪些,嵌入式硬件工程师要求是什么?需要掌握哪些内容...
  4. 什么是SQL注入式攻击,如何去防范SQL注入式攻击
  5. 究竟新买的手机电池第一次要充多久的电
  6. 郑豪8.7黄金跳水下跌,下周还会延续跌势吗?黄金开盘思路最新操作建议
  7. 微信授权,其实2步很简单
  8. Vista中运行软件的兼容性测试(转)
  9. CANopen总线的协议详解
  10. vue3 ref 和 reactive 区别