原题

Description:

平面直角坐标系中给定n个点, 每一次只能将一个点移动一个单位, 求移动的最小次数使得这n个点位于同一水平线上且全部相邻.

Input:

n:点的个数(1<= n <=10000)

接下来i(1<= i <=n)行每行输入第i个点的横纵坐标, 中间空格隔开. (-10000 <= x[i],y[i] <= 10000)

Output:

最小移动的步数

Solution:

先只考虑纵坐标, 对于最两端的点, 同时移动到点连线内的任意一位置所需的距离相同, 且均小于移动到点连线外任意位置的距离.

对于次两端的点也是如此, 以此类推, 想要达到纵坐标上的移动步数的最小值, 只需将这n个点先排序, 再全部移到中位数的点处.

(假定已经对y[]进行了排序)即 y[0] -> y[n / 2], y[1] -> y[n / 2], ......, y[n - 1] -> y[n / 2]; 步数为∑y[i] - y[n / 2];

再来考虑横坐标, 假定移动完成后横坐标最左边的点坐标为 xx

则需要将(注意:这个时候已经对x[]完成了排序, 原本左边的点最后也在左边) //大概是这么说的吧

x[0] -> xx + 0;

x[1] -> xx + 1;

...

x[n - 1] -> xx + (n - 1);

转换后变成

x[0] - 0 -> xx;

x[1] - 1 -> xx;

...

x[n - 1] - ( n - 1) -> xx;

所需的步数为了 ∑abs(x[i] - i - xx);

所需要做的即是找出xx, 观察到x[i] - i -> xx与纵坐标的形式类似. 可以得出, xx 即为将x[i] - i 重新排序后的中间值.

AC code:

#include<cstdio>
#include<cstring>
#include<iostream>
#include<cstdlib>
#include<cmath>
#include<algorithm>
#include<queue>
#include<stack>
#include<set>
#include<map>
#include<functional>
using namespace std;
int x[10000 + 5], y[10000 + 5];
int _x[10000 + 5];
int main()
{int x_steps = 0, y_steps = 0, ans = 0;int n;scanf("%d", &n);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] = x[i] - i;}sort(_x, _x + n);for (int i = 0; i < n; i++){y_steps += abs(y[i] - y[n / 2]);x_steps += abs(x[i] - i - _x[n / 2]);}ans = x_steps + y_steps;printf("%d\n", ans);return 0;
}

最后, WA了很多次, 一直没找到错在哪, 最后把qsort()换成了sort()就过了, 真心求dalao告知这是为什么...

POJ 1723 SOLDIERS相关推荐

  1. POJ 1723 Soldiers (中位数)

    $ POJ~1723~Soldiers $ (中位数) $ solution: $ 这道题说难也不算太难,但是当时自己想的很矛盾.所以还是列一篇题解. 这道题首先比较容易看出来的就是:行和列是两个分开 ...

  2. 【POJ 1723 --- SOLDIERS】

    [POJ 1723 --- SOLDIERS] Description N soldiers of the land Gridland are randomly scattered around th ...

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

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

  4. G - SOLDIERS POJ - 1723 sort+数学

    G - SOLDIERS POJ - 1723 题解 好妙啊! 由于与路径没啥关系,走折线即可 先找出 y 的中位数,全部走到中位数的位置 对 x ,先排序,再构造一个 temp[i] = x[i] ...

  5. POJ 1723 士兵排队 C语言实现

    ** POJ 1723 士兵排队 C语言实现 ** ** 原文 ** Description N soldiers of the land Gridland are randomly scattere ...

  6. poj 1723 中位数

    最近在看一些中位数的东西,然后顺便也看了些题目.poj 1723不仅要求到水平位置的最短距离和,还要求水平都相邻的排成一排的最短距离和,即士兵都站成一列. 到y轴的距离好办,按y轴坐标排序,求中位数, ...

  7. 【POJ 1723】SOLDIERS(排序、中位数)

    题面:SOLDIERS 题目大意 有 nnn 个士兵,并且知道每个士兵在二维坐标图上的位置. 士兵可以进行移动,但是每个士兵每次只能向上.向下.向左或向右移动一个单位,因此,他的 xxx 或 yyy ...

  8. SOLDIERS(POJ 1723)

    这个题和算法书上的2.22题类似,因此y轴只要求出中位数,然后所有的点都要移动到中位数. x轴的情况有点不同, 想了好久终于想明白了. 首先将x升序排序(因为最终的相对位置是不变的),然后设首个元素的 ...

  9. POJ 1723(中位数+连续排列)

    题目大意:有N个士兵,每个士兵开始站的坐标是(x,y),现在使得将N个士兵站在同一个水平线(即所有士兵的y坐标相同)并且x坐标相邻,每个士兵每次可以移动一个位置(分别在x和y方向移动).求出最少的移动 ...

最新文章

  1. SVN版本控制系统使用
  2. [KIWI syslog]Install document
  3. 如何禁止使用本地administrator进行共享连接
  4. 百度java验证码不显示不出来,Java-使用百度链接时,遇到无法弹出用户登录框的问题...
  5. git 常用命令整理
  6. Docker配置mysql互为主从
  7. Laravel项目上传github后,clone到本地运行时报错500的解决方法
  8. boost::fusion::traits::tag_of用法的测试程序
  9. 路由交换以及其他网络名词基本概念
  10. 系统输入输入出设计相关知识介绍
  11. class没有发布到tomcat_总在说SpringBoot内置了tomcat启动,那它的原理你说的清楚吗?
  12. 从电视机的角度来看设计模式之命令模式
  13. Git 使用方法(一)-本地篇
  14. EasyRTMP实现对接海康、大华等IPCamera SDK进行RTMP推送直播功能
  15. unity数组或链表需要空间很大赋值与调用
  16. 产品配件类目税目分类_终于找到了!“税收分类编码大全”,有这一篇就够了!...
  17. 计算机网络毕业设计汇报ppt,计算机ppt毕业设计模板
  18. PHP对接抖音开发平台接口
  19. 域名解析指向详细操作(图解)
  20. 80核处理器_【装机帮扶站】第690期:12核amp;16核怪兽CPU配置推荐

热门文章

  1. Photoshop调出田园照片唯美手绘油画效果
  2. 不同PyTorch版本训练同一个代码结果差异巨大
  3. 英雄联盟7月23日维修服务器,英雄联盟7月23日更新维护到几点结束 7月23日lol10.15版本更新维护结束时间...
  4. 【AI语音】魔百盒M301H-JL代工-3798MV300芯片-支持蓝牙_免费固件包
  5. 向量学习过程思想总结概括
  6. 嵌入式成长轨迹33 【嵌入式学习阶段】【ARM环境调试】【在虚拟机下Ubuntu建立NFS网络文件系统】...
  7. 【PC工具】压缩包密码破解工具,暴力破解压缩包密码,解压密码获取
  8. 手机图形计算器matlab,科学图形计算器 Mathlab-科学图形计算器手机版下载V4.12-西西软件下载...
  9. python精灵什么意思_图像和精灵有什么区别?
  10. 视频教程-大数据电视收视率实战项目教程(企业级案例)-Spark