【排序专训】练习题 士兵站队(中位数应用) 解题报告
【问题描述】
在一个划分成网格的操场上,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;
}
【排序专训】练习题 士兵站队(中位数应用) 解题报告相关推荐
- POJ - 1723 Soldiers 士兵站队 排序+中位数
[问题描述] 在一个划分成网格的操场上,n个士兵散乱地站在网格点上.网格点由整数最表(x,y)表示.士兵可以沿着网格边上.下.左.右移动一步,但在同一时刻一个网格上只能有一名士兵.按照军官的命令,士兵 ...
- 算法设计与分析: 2-7 士兵站队问题
2-7 士兵站队问题 问题描述 在一个划分成网格的操场上,n个士兵散乱地站在网格点上.网格点由整数坐标(x,y)表示.士兵们可以沿网格边上.下.左.右移动一步,但在同一时刻任一网格点上只能有一名士兵. ...
- luogu1889 士兵站队
luogu1889 士兵站队 时空限制 1000ms/128MB 题目描述 在一个划分成网格的操场上, n个士兵散乱地站在网格点上.由整数 坐标 (x,y) 表示.士兵们可以沿网 ...
- matlab hist函数_算法工匠MATLAB专训营:Matlab绘图,小试牛刀
作者 | 蔡老师 仿真秀专栏作者 首发 | 仿真秀平台 导读:正文之前,我在此详细说明一下,因为本文包含的程序太难得,网上肯定找不到这样的程序.随着讲课的越来越深入,我给出的程序会越来越实用,接近于实 ...
- 【集训】DFS/BFS专训2
DFS/BFS专训2 文章目录 DFS/BFS专训2 A. 面积 B. 营救 C. 最少转弯问题 D. 麻将游戏 E. 门票问题 F. 奇怪的电梯(lift) A. 面积 题目描述 编程计算由&quo ...
- 【集训】DFS/BFS专训3
DFS/BFS专训3 文章目录 DFS/BFS专训3 A. 生日蛋糕 B. 埃及分数 C. 最优贸易 D. 关系网络 E. 四色地图 F. 小猫爬山 G. 最大黑区域 H. 引水入城 I. 武士风度的 ...
- 2021字节跳动校招秋招算法面试真题解题报告--leetcode148 排序链表,内含7种语言答案
148.排序链表 1.题目描述 在 O(n log n) 时间复杂度和常数级空间复杂度下,对链表进行排序 2.解题报告 针对nlogn的排序算法,主要有快速排序,归并排序和堆排序.其中,堆排序利用了数 ...
- 实训项目——多语言学习app 总结报告
文章目录 实训项目--多语言学习app 总结报告 1. app 介绍 1. 运行app 2. 界面效果 2. 开发过程 1. 开发环境 2. 项目结构 3. 欢迎界面 4. 用户与学习界面 5. 语言 ...
- 中位数的应用—士兵站队问题
pku 1723--士兵战队问题 Description N soldiers of the land Gridland are randomly scattered around the count ...
最新文章
- 【剑指offer-Java版】45圆圈中最后剩下的数字
- 【控制】《多智能体系统的协同群集运动控制》陈杰老师-第10章-一阶多智能体系统非合作行为检测与隔离
- 【攻防世界002】EasyRE
- halcon识别ocr汉字_手写汉字识别——手写文本快速电子化的好方法
- 怎么将java异常释放_Java_异常处理
- 7.hdfs工作流程及机制
- 计算机任务管理器恢复默认,关于任务管理器的一个问题??
- 拓端tecdat|用R语言软件估计光谱密度
- linux驱动之设备号与创建设备节点
- 二进制文件和文本文件区别-小白笔记
- HTML emoji
- win10系统玩部分老游戏时提示0xc0000022的解决方法.
- DDOS攻击如何防御
- Python - 面向对象编程 - 公共属性、保护属性、私有属性
- php 模态框效果,超酷的模态框效果 - Nifty
- uniapp苹果打包(需使用苹果电脑)
- 2021中国大学生程序设计竞赛(CCPC)- 网络选拔赛(重赛)Subpermutation
- LTE参数RSRP、RSSI、RSRQ、RS-CINR
- 2018_10_17 模拟赛
- 安卓上有哪些好用的时间管理待办清单便签APP?