LFYZ-OJ ID: 1017 士兵站队问题
分析
该题和“输油管道问题”类似,只不过由一维问题编程了二维问题。可以将总步数分解为移动到水平线y位置的总步数ysteps和移动到序列x, x+1, x+2, ... , x+n-1位置的总步数xsteps。
- ysteps的最小值容易计算,将所有士兵的纵坐标
ypos[]排序后找出中位数,然后计算abs(xpos[1...n]-zws)即可。 - xsteps的作如下分析:
共n个士兵,他们相应的X轴坐标为:
x0, x1, x2 ... xn-1
设,士兵需要移动到的最终位置的x轴坐标值为:x, x+1, x+2, ..., x+(n-1)
则所求最优步数S=|x0-x|+|x1-(x+1)|+|x2-(x+2)|+...+|xn-1-(x+(n-1))|
经过变形S=|x0-x|+|(x1-1)-x|+|(x2-2)-x|+ ... +|(xn-1-(n-1))-x|
发现没有,问题已经变了,我们现在是在求序列x0, x1-1, x1-2, x1-3, ... xn-1-(n-1)与x绝对值之差的累加和的最小值。这和y方向上的计算是一样的了!因此还是采用取中位数的办法求得x值,最后算出最优解。
- 整理一下, 思路如下:
- 排序y序列ypos
- 求出y坐标序列ypos的中位数y_zws
- 计算y方向上的最小步数ysteps
- 排序x序列xpos
- 计算新序列
xpos[i]-=(i-1),如xpos[5]-=4 - 排序x序列xpos
- 计算x方向上的最小步数xsteps
- 输出
xsteps+ysteps
代码示例
#include<iostream>
#include<cmath>
using namespace std;
int xpos[10001]; //士兵x坐标集合
int ypos[10001]; //士兵y坐标集合
void qsort(int Data[], int low, int high){ //快速排序
int i=low, j=high, m=Data[(low+high)/2];
while(i<=j){
while(Data[i]<m) i++;
while(Data[j]>m) j--;
if(i<=j){
int t=Data[i];
Data[i]=Data[j];
Data[j]=t;
i++, j--;
}
}
if(j>low) qsort(Data, low, j); //对右部分排序
if(i<high) qsort(Data, i, high); //对左部分排序
}
int main(){
int n, steps=0;
scanf("%d", &n);
for(int i=1; i<=n; i++) scanf("%d%d", &xpos[i], &ypos[i]);
qsort(ypos, 1, n); //排序ypos序列
qsort(xpos, 1, n); //排序xpos序列
for(int i=1; i<=n; i++) xpos[i]-=(i-1); //生成新的xpos序列
qsort(xpos, 1, n); //重排xpos序列
for(int i=1; i<=n; i++) //计算步数
steps+=(abs(xpos[i]-xpos[n/2+1])+abs(ypos[i]-ypos[n/2+1]));
printf("%d", steps);
return 0;
}
LFYZ-OJ ID: 1017 士兵站队问题的更多相关文章
- 3625 codevs 士兵站队问题 中位数的妙用
士兵站队问题 题目描述 Description 在一个划分成网格的操场上,n个士兵散乱地站在网格点上.网格点用整数坐标(x,y)表示.士兵们可以沿网格边往上.下.左.右移动一步,但在同一时刻任一网格点 ...
- 洛谷 P1889 士兵站队
P1889 士兵站队 题目描述 在一个划分成网格的操场上, n个士兵散乱地站在网格点上.由整数 坐标 (x,y) 表示.士兵们可以沿网格边上.下左右移动一步,但在同时刻任一网格点上只能有名士兵.按照军 ...
- 洛谷P1889 士兵站队
题目描述 在一个划分成网格的操场上, n个士兵散乱地站在网格点上.由整数 坐标 (x,y) 表示.士兵们可以沿网格边上.下左右移动一步,但在同时刻任一网格点上只能有名士兵.按照军官的命令,们要整齐地列 ...
- 士兵站队问题sol
作者:http://www.cnblogs.com/taoziwel/articles/1859577.html 相类似题目:输油管道问题 [问题描述] 在一个划分成网格的操场上,n个士兵散乱地站在网 ...
- 【NEUQACM OJ】1017: 平面切割(特别版)
1017: 平面切割(特别版) 题目描述 我们要求的是n条闪电型折线分割平面的最大数目.比如,一条闪电型折线可以将平面分成两部分,两条最多可以将平面分成12部分,三条最多可将平面分成31部分,四条最多 ...
- 九度oj 题目1017:还是畅通工程
题目描述: 某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离.省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可 ...
- POJ 1017
http://poj.org/problem?id=1017 题意就是有6种规格的物品,给你一些不同规格的物品,要求你装在盒子里,盒子是固定尺寸的也就是6*6,而物品有1*1,2*2,3*3,4*4, ...
- Poj 1017 / OpenJudge 1017 Packets/装箱问题
1.链接地址: http://poj.org/problem?id=1017 http://bailian.openjudge.cn/practice/1017 2.题目: 总时间限制: 1000ms ...
- POJ - 1017 贪心训练
Packets Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 59725 Accepted: 20273 Descrip ...
随机推荐
- 我的第一个python web开发框架(35)——权限数据库结构设计
接下来要做的是权限系统的数据库结构设计,在上一章我们了解了权限系统是通过什么来管理好权限的,我们选用其中比较常用的权限系统来实现当前项目管理要求. 下面是我们选择的权限系统关系模型: 从以上关系可以看 ...
- linux 配置vim(vimrc)
打开终端:ctrl+alt+t 进入vim文件:cd /etc/vim 打开vimrc文件:sudo gedit vimrc 然后在行末if语句前加上下面的内容," 这个符号为注释,后面内 ...
- 一次CMS GC问题排查过程(理解原理+读懂GC日志)
这个是之前处理过的一个线上问题,处理过程断断续续,经历了两周多的时间,中间各种尝试,总结如下.这篇文章分三部分: 1.问题的场景和处理过程:2.GC的一些理论东西:3.看懂GC的日志 先说一下问题吧 ...
- element 关闭弹窗时清空表单信息
关闭弹窗时清空表单信息: // 弹框关闭时清空信息 closeDialog () { this.$nextTick(() => { this.$refs['createModelForm'].c ...
- elementUI el-table渲染的时候出现bug
如下: 问题: value的值一直渲染不出来,因为是boolean类型,出现了bug,把true变成一个字符串就能显示了,太不好用了 为了能渲染出来,不得不写成下列形式:
- WPFの命中测试
概述: WPF中的Canvas是常用的一个绘图控件,可以方便地在Canvas中添加我们需要处理的各种元素如:图片.文字等.但Canvas中元素增加到一定数量,并且有重合的时候,我们如何通过在Canv ...
- js 批量替换
html = html.replace(new RegExp(title,"gm"), "<span style='color:red;'>"+ti ...
- python小白——进阶之路——day4天-———流程控制while if循环
# ### 代码块: 以冒号作为开始,用缩进来划分作用域,这个整体叫做代码块 if 5 == 5: print(1) print(2) # 注意点: 要么全部使用4个空格,要么全部使用1个缩进 ,这样 ...
- Kali Linux Netcat 学习 与 网络攻击
Netcat 网络攻击 以及 应用 1.用Netcat进行黑客攻击第1部分:基础知识 Netcat是一个很好的网络实用程序,用于使用TCP和UPD协议读取和写入网络连接.Netcat通常被称为网络工具 ...
- linux安装tomcat部署web项目
我用的是如下图的两个软件,连接linux服务器. 其中WinSCp是传输文件用的,SecureCRT是用来输入命令的. 1.复制tomcat到指定目录(可复制到你想要的目录下),命令如下: cp /路 ...