【问题描述】  
  
  在一个划分成网格的操场上,n个士兵散乱地站在网格点上。网格点由整数最表(x,y)表示。士兵可以沿着网格边上、下、左、右移动一步,但在同一时刻一个网格上只能有一名士兵。按照军官的命令,士兵们要整齐地列成一个水平队列,即排列成(x,y),(x+1,y),…,(x+n-1,y)。如何选择x,y的值,才能使士兵们以最少的总移动步数排成一列。

  请计算使所有士兵排成一行需要的最少移动步数。 
 
    
 【输入格式】  
  
  第1行是士兵总数n。接下来的n行是士兵的初始位置,每行两个整数x和y。
 
    
 【输出格式】  
   
  输出士兵排成一行需要的最少移动步数。

【输入样例】   
   
5
1 2
2 2
1 3
3 -2
3 3 
 
    
 【输出样例】  
   
8
 
    
 【数据范围】  
   
1<=n<=10000  -10000<=x,y<=10000

【来源】  
  
《一本通》167页

解题思路:根据题意,要求所有士兵的最小移动步数,首先要找出他们需站成的水平队列的第一个坐标(x,y)。求该点的纵坐标y很容易,只需将所有士兵的坐标按纵坐标由小到大排序,他们纵坐标的中位数即为所求点的纵坐标y。然而要求该点的横坐标x,就需仔细思考,我们可以知道要使所有士兵的移动步数最小,那么每个士兵都应该移动到离自己最近的队列位置,但又不能插队,所以第一个士兵应该移动进队列的第一个位置,第二个士兵应该移动进队列的第二个位置……设每个士兵的横坐标按由小到大排序后为X0,X1,X2,……所以,我们可以得出所有士兵在x方向的移动步数为|X0-x|+|X1-(x+1)|+…+|Xn-1-(x+n-1)|,将该式子变形可得|X0-x|+|(X1-1)-x|+…+|(Xn-1-(n-1))-x|,可以发现,要使该式子最小,则x为X0,X1-1,X2-2,…,Xn-1-(n-1)的中位数。由此就可以找出水平队列的第一个坐标(x,y),然后根据第一个士兵移动进队列的第一个位置,第二个士兵移动进队列的第二个位置……计算出移动步数即为最小移动步数。

#include<cstdio>
#include<cstdlib>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<cmath>
using namespace std;
const int maxn=10005;
int N;
struct data
{int x,y;
};
data a[maxn],b[maxn];
bool cmp1(data aa,data bb)  //按纵坐标由小到大排序
{return aa.y<bb.y;
}
bool cmp2(data aa,data bb)  //按横坐标由小到大排序
{return aa.x<bb.x;
}
int main()
{freopen("48.in","r",stdin);//freopen("48.out","w",stdout);scanf("%d",&N);for(int i=1;i<=N;i++)scanf("%d%d",&a[i].x,&a[i].y);sort(a+1,a+1+N,cmp1);int ax,ay;ay=a[(N+1)/2].y;memcpy(b,a,sizeof(b));sort(b+1,b+1+N,cmp2);for(int i=1;i<=N;i++)b[i].x=b[i].x-i+1;sort(b+1,b+1+N,cmp2);  //注意这里要再次按横坐标由小到大排序ax=b[(N+1)/2].x;sort(a+1,a+1+N,cmp2);int ans=0;for(int i=1;i<=N;i++){ans+=abs(a[i].x-(ax+i-1))+abs(a[i].y-ay);}printf("%d\n",ans);return 0;
}

【排序专训】练习题 士兵站队(中位数应用) 解题报告相关推荐

  1. POJ - 1723 Soldiers 士兵站队 排序+中位数

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

  2. 算法设计与分析: 2-7 士兵站队问题

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

  3. luogu1889 士兵站队

    luogu1889  士兵站队​​​​​​​ 时空限制    1000ms/128MB 题目描述 在一个划分成网格的操场上, n个士兵散乱地站在网格点上.由整数 坐标 (x,y) 表示.士兵们可以沿网 ...

  4. matlab hist函数_算法工匠MATLAB专训营:Matlab绘图,小试牛刀

    作者 | 蔡老师 仿真秀专栏作者 首发 | 仿真秀平台 导读:正文之前,我在此详细说明一下,因为本文包含的程序太难得,网上肯定找不到这样的程序.随着讲课的越来越深入,我给出的程序会越来越实用,接近于实 ...

  5. 【集训】DFS/BFS专训2

    DFS/BFS专训2 文章目录 DFS/BFS专训2 A. 面积 B. 营救 C. 最少转弯问题 D. 麻将游戏 E. 门票问题 F. 奇怪的电梯(lift) A. 面积 题目描述 编程计算由&quo ...

  6. 【集训】DFS/BFS专训3

    DFS/BFS专训3 文章目录 DFS/BFS专训3 A. 生日蛋糕 B. 埃及分数 C. 最优贸易 D. 关系网络 E. 四色地图 F. 小猫爬山 G. 最大黑区域 H. 引水入城 I. 武士风度的 ...

  7. 2021字节跳动校招秋招算法面试真题解题报告--leetcode148 排序链表,内含7种语言答案

    148.排序链表 1.题目描述 在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序 2.解题报告 针对nlogn的排序算法,主要有快速排序,归并排序和堆排序.其中,堆排序利用了数 ...

  8. 实训项目——多语言学习app 总结报告

    文章目录 实训项目--多语言学习app 总结报告 1. app 介绍 1. 运行app 2. 界面效果 2. 开发过程 1. 开发环境 2. 项目结构 3. 欢迎界面 4. 用户与学习界面 5. 语言 ...

  9. 中位数的应用—士兵站队问题

    pku 1723--士兵战队问题 Description N soldiers of the land Gridland are randomly scattered around the count ...

最新文章

  1. 【剑指offer-Java版】45圆圈中最后剩下的数字
  2. 【控制】《多智能体系统的协同群集运动控制》陈杰老师-第10章-一阶多智能体系统非合作行为检测与隔离
  3. 【攻防世界002】EasyRE
  4. halcon识别ocr汉字_手写汉字识别——手写文本快速电子化的好方法
  5. 怎么将java异常释放_Java_异常处理
  6. 7.hdfs工作流程及机制
  7. 计算机任务管理器恢复默认,关于任务管理器的一个问题??
  8. 拓端tecdat|用R语言软件估计光谱密度
  9. linux驱动之设备号与创建设备节点
  10. 二进制文件和文本文件区别-小白笔记
  11. HTML emoji
  12. win10系统玩部分老游戏时提示0xc0000022的解决方法.
  13. DDOS攻击如何防御
  14. Python - 面向对象编程 - 公共属性、保护属性、私有属性
  15. php 模态框效果,超酷的模态框效果 - Nifty
  16. uniapp苹果打包(需使用苹果电脑)
  17. 2021中国大学生程序设计竞赛(CCPC)- 网络选拔赛(重赛)Subpermutation
  18. LTE参数RSRP、RSSI、RSRQ、RS-CINR
  19. 2018_10_17 模拟赛
  20. 安卓上有哪些好用的时间管理待办清单便签APP?

热门文章

  1. ipx互联网分组交换协议_什么是X.25分组交换网络协议?
  2. vi编辑器的四种退出方式
  3. 使用ajax从服务器端获取数据
  4. IE浏览器不能上网而其他浏览器可以正常上网解决办法
  5. Kurento 第一坑
  6. 牛客练习赛52 B:Galahad(树状数组维护区间不同元素和(个数))
  7. visual studio 2010 如何修改assemblyInfo.cs默认值
  8. 新闻资讯类网站的PC端前台模板分享
  9. 鸿蒙系统运行内存为啥只有8g,为什么手机运存是8G的,但是可用却只有5G?
  10. 6g运行和8g运行有什么差别