swustoj Soldiers
输入
第1 行是油井数n,1< =n< =10000。接下来n 行是油井的位置,每行2个整数x和y,-10000< =x,y< =10000。
输出
第1 行中的数是士兵排成一行需要的最少移动步数。
样例输入
5 1 2 2 2 1 3 3 -2 3 3
样例输出
8
通过适当的移动顺序和移动路线可以使得同一时刻不会有两名士兵站在同一点
二 题目要求最佳移动方式(即求移动的最少步数)
题目要求转化为求士兵站立的“最终位置”,即如何取“最终位置”使得士兵移动的步数最少(最优)
Y轴方向上的考虑
设目标坐标为M,即n个士兵最终需要移动到的Y轴的坐标值为M
n个士兵的Y轴坐标分别为:
Y0,Y1,Y2 …… …… Yn-1
则最优步数S=|Y0-M|+|Y1-M|+|Y2-M|+ …… …… +|Yn-1-M|
结论:M取中间点的值使得S为最少(最优)
证明:……
从最上和最下的两个士兵开始递推……
最优位置
最优位置
归结到最后,处于中间位置的士兵的Y轴坐标值就是“最终位置”的Y轴坐标
可能有两种情况
士兵总数为双数情况:取中间两点间的任意一个位置
士兵总数为单数情况:取中间点的所在位置
解决办法:对所有的Y轴坐标进行排序(O(nlogn))或者进行线性时间选择(O(n))
然后取“中间”点的Y轴坐标值作为最佳位置M的值
最后通过公式求出Y轴方向上移动的最优步数
X轴方向上的考虑
首先需要对所有士兵的X轴坐标值进行排序
然后,按从左至右的顺序依次移动到每个士兵所对应的“最终位置”(最优),所移动的步数总和就是X轴方向上需要移动的步数
例,最左的士兵移动到“最终位置”的最左那位,第二个士兵移动到“最终位置”的第二位
则总的步数为:士兵一移动步数+士兵二移动步数+ …… +士兵n移动步数
如何确定X轴方向上的最佳的“最终位置”?
共n个士兵
他们相应的X轴坐标为:X0,X1,X2 …… …… Xn-1
设,士兵需要移动到的“最终位置”的X轴坐标值为:k,k+1,k+2 …… …… k+(n-1)
则所求最优步数S=|X0-k|+|X1- (k+1) |+|X2-(k+2)|+ …… +|Xn-1-(k+(n-1))|
经过变形S=|X0-k|+|(X1-1)-k|+|(X2-2)-k|+ …… …… +|(Xn-1-(n-1))-k|
注意到公式的形式与Y轴方向上的考虑一样,同样是n个已知数分别减去一个待定数后取绝对值,然后求和
因此还是采用取中位数的办法求得k值,最后算出最优解
#include<stdio.h>
#include<iostream>
#include<stdlib.h>
#include<string.h>
#include<algorithm>
#include<string>
#include<time.h>
#include<queue>
using namespace std;
const int INF = 0x3f3f3f3f;int main()
{int n;while (cin >> n) {int x[10005];int y[10005];for (int i = 0;i < n;i++) {scanf("%d%d", x + i, y + i);}sort(x, x + n);sort(y, y + n);for (int i = 0;i < n;i++) {x[i] -= i;}sort(x, x + n);int midx = x[(n-1) / 2];int midy = y[(n-1) / 2];int ans = 0;for (int i = 0;i < n;i++) {ans += abs(x[i] - midx);ans += abs(y[i] - midy);}cout << ans << endl;}return 0;
}
swustoj Soldiers相关推荐
- G - SOLDIERS POJ - 1723 sort+数学
G - SOLDIERS POJ - 1723 题解 好妙啊! 由于与路径没啥关系,走折线即可 先找出 y 的中位数,全部走到中位数的位置 对 x ,先排序,再构造一个 temp[i] = x[i] ...
- POJ 1723 Soldiers (中位数)
$ POJ~1723~Soldiers $ (中位数) $ solution: $ 这道题说难也不算太难,但是当时自己想的很矛盾.所以还是列一篇题解. 这道题首先比较容易看出来的就是:行和列是两个分开 ...
- SWUSTOJ #954 单链表的链接
SWUSTOJ #954 单链表的链接 题目 输入 输出 样例输入 样例输出 源代码 题目 建立长度为 n 的单链表 A 和长度为 m 的单链表 B .编程实现将 B 表链接在 A 表的尾端,形成一个 ...
- SWUSTOJ #77 计算员工周工资
SWUSTOJ #77 计算员工周工资 题目 输入 输出 样例输入 样例输出 源代码 题目 编写一个程序,输入某雇员的每周工作时间(以小时计)和每小时的工资数,计算并输出他的工资.(如果时间小于0或大 ...
- SWUSTOJ #971 统计利用先序遍历创建的二叉树的深度
SWUSTOJ #971 统计利用先序遍历创建的二叉树的深度 题目 输入 输出 样例输入 样例输出 源代码 题目 利用先序递归遍历算法创建二叉树并计算该二叉树的深度.先序递归遍历建立二叉树的方法为:按 ...
- SWUSTOJ #617 班级课程成绩计算
SWUSTOJ #617 班级课程成绩计算 题目 输入 输出 样例输入 样例输出 源代码 题目 一个班有N名学生,每个学生修了五门课. 1)求每个学生的平均成绩,并输出每个学生的学号,每门课程的成绩及 ...
- SWUSTOJ #616 排序查找
SWUSTOJ #616 排序查找 题目 输入 输出 样例输入 样例输出 源代码 题目 用选择法对N个学生的成绩按从大到小的顺序排序,N个学生的成绩整数用scanf 输入,输入的成绩在[0,100]之 ...
- SWUSTOJ #78 计算生日是星期几
SWUSTOJ #78 计算生日是星期几 题目 输入 输出 样例输入 样例输出 源代码 题目 编写一个程序,只要输入年月日,就能回答那天是星期几. 能被4整除但不能被100整除的,或者能被400整除的 ...
- SWUSTOJ #953 单链表的删除操作的实现
SWUSTOJ #953 单链表的删除操作的实现 题目 输入 输出 样例输入 样例输出 源代码 题目 建立长度为 n 的单链表,删除第 i 个结点之前的结点. 输入 第一行为自然数 n,表示链式线性表 ...
最新文章
- zlmediakit DESCRIBE:404 Not Found
- C# SqlBulkCopy数据批量入库
- html多个盒子重叠浮动,如何让浮动后的多个盒子水平居中
- 麻省理工计算机科学录取条件,2018美国留学:麻省理工学院托福分数最低录取要求...
- 【CodeForces - 260A】Adding Digits (思维构造)
- Java高级语法笔记-文件及目录操作
- jsoup解析器快速入门
- 暴风影音硬件加速播放高清影片
- python机械臂仿真_如何用ROS+Rviz+Arbotix控制器仿真为六自由度机械臂建模-工业电子-与非网...
- 计算机技术与高中英语教学整合,计算机技术与高中英语课程整合的探讨(多媒体英语教学系列论文十篇).doc...
- Excel如何批量设置行高
- vue静态资源打包中的坑与解决方案
- android usb 读写权限,Android默认给予USB读写权限,去掉受权对话框
- 获取 Windows Mobile 设备的唯一标识 [转载 from 黎波'blog ]
- 浅谈MySQL中优化sql语句查询常用的30种方法
- 集易市场微信小程序项目
- P2698 [USACO12MAR]花盆Flowerpot 单调队列
- Android 程序锁
- iOS13升级后的第一感觉:旧版iPhone重生,并向您提供了20个隐藏功能!
- 前端vue开发页面按钮字体颜色白色或文本框不存在谷歌
热门文章
- python使用selenium 打开谷歌浏览器闪退, 怎么解决
- 2021年汽车修理工(初级)报名考试及汽车修理工(初级)最新解析
- 2022年R1快开门式压力容器操作判断题模拟考试平台操作
- bootstraptable 列隐藏_bootstraptable 隐藏列的方法
- 平衡之道:区块链是一场非常大型的社会实验(圆桌实录)
- Android 签名文件迁移到行业标准格式 PKCS12
- CSS3 object-fit视频和图片比例自适应
- [飞腾]Trace32使用概述
- 首次全面定义,《2022企业应用运维管理指标体系白皮书》发布
- 对 makefile 中 .SUFFIXES 的学习体会