分析

该题和“输油管道问题”类似,只不过由一维问题编程了二维问题。可以将总步数分解为移动到水平线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值,最后算出最优解。

  • 整理一下, 思路如下:

    1. 排序y序列ypos
    2. 求出y坐标序列ypos的中位数y_zws
    3. 计算y方向上的最小步数ysteps
    4. 排序x序列xpos
    5. 计算新序列xpos[i]-=(i-1),如xpos[5]-=4
    6. 排序x序列xpos
    7. 计算x方向上的最小步数xsteps
    8. 输出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 士兵站队问题的更多相关文章

  1. 3625 codevs 士兵站队问题 中位数的妙用

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

  2. 洛谷 P1889 士兵站队

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

  3. 洛谷P1889 士兵站队

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

  4. 士兵站队问题sol

    作者:http://www.cnblogs.com/taoziwel/articles/1859577.html 相类似题目:输油管道问题 [问题描述] 在一个划分成网格的操场上,n个士兵散乱地站在网 ...

  5. 【NEUQACM OJ】1017: 平面切割(特别版)

    1017: 平面切割(特别版) 题目描述 我们要求的是n条闪电型折线分割平面的最大数目.比如,一条闪电型折线可以将平面分成两部分,两条最多可以将平面分成12部分,三条最多可将平面分成31部分,四条最多 ...

  6. 九度oj 题目1017:还是畅通工程

    题目描述:     某省调查乡村交通状况,得到的统计表中列出了任意两村庄间的距离.省政府“畅通工程”的目标是使全省任何两个村庄间都可以实现公路交通(但不一定有直接的公路相连,只要能间接通过公路可达即可 ...

  7. POJ 1017

    http://poj.org/problem?id=1017 题意就是有6种规格的物品,给你一些不同规格的物品,要求你装在盒子里,盒子是固定尺寸的也就是6*6,而物品有1*1,2*2,3*3,4*4, ...

  8. Poj 1017 / OpenJudge 1017 Packets/装箱问题

    1.链接地址: http://poj.org/problem?id=1017 http://bailian.openjudge.cn/practice/1017 2.题目: 总时间限制: 1000ms ...

  9. POJ - 1017 贪心训练

    Packets Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 59725   Accepted: 20273 Descrip ...

随机推荐

  1. 用Angular部署Cesium

    用到的集成开发环境是WebStrom,Cesium版本是1.50.0,Angular版本是6.2.4  1.首先我们安装cesium,在webstorm中的Termianl中输入 npm instal ...

  2. 认识多线程中start和run方法的区别?

    一.认识多线程中的 start() 和 run() 1.start(): 先来看看Java API中对于该方法的介绍: 使该线程开始执行:Java 虚拟机调用该线程的 run 方法. 结果是两个线程并 ...

  3. 【Python 03】程序设计与Python语言概述

    人生苦短,我用Python. Python在1990年诞生于荷兰,2010年Python2发布最后一版2.7,Python核心团队计划在2020年停止支持 Python2,目前Python3是未来. ...

  4. addq

    <template> <el-row id="AddRoom"> <el-col :xs="0" :sm="2" ...

  5. MySQL之索引原理和慢查询优化

    一 介绍 为何要有索引? 一般的应用系统,读写比例在10:1左右,而且插入操作和一般的更新操作很少出现性能问题,在生产环境中,我们遇到最多的,也是最容易出问题的,还是一些复杂的查询操作,因此对查询语句 ...

  6. android 实现点击edittext的“小眼睛”切换明密文

    android 实现点击edittext的“小眼睛”切换明密文    版权声明:本文为博主原创文章,未经博主允许不得转载.   很多时候,我们为了用户的隐私安全,需要在密码输入的时候,显示密文.为了更 ...

  7. CodeChef Dynamic GCD

    嘟嘟嘟vjudge 我今天解决了一个历史遗留问题! 题意:给一棵树,写一个东西,支持一下两种操作: 1.\(x\)到\(y\)的路径上的每一个点的权值加\(d\). 2.求\(x\)到\(y\)路径上 ...

  8. linux目录2

    19.linux注释多行 20.防火墙 21.创建逻辑卷 22.两台主机,ssh端口不同,如何拷贝文件    

  9. python之log

    #!/usr/bin/python # -*- coding: UTF- -*- ''' ''' import logging # 设置输出文件.文件格式和日志级别 logging.basicConf ...

  10. C#7.0中的解构功能---Deconstruct

    解构元组 C#7.0新增了诸多功能,其中有一项是新元组(ValueTuple),它允许我们可以返回多个值,并且配合解构能更加方便的进行工作,如下面例子 static void Main(string[ ...