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

  到y轴的距离好办,按y轴坐标排序,求中位数,然后求所有到中位数的距离和。

  但是在x上怎么样才能最短呢?百思不得其解啊,最后看了这篇之后,豁然开朗。

  x轴方向,先把x[]排好序,要想移动的距离最短,那么这时的相对位置肯定不变。那么假设a是这个队列的最左边的x坐标,那么它们的关系就有就有

x[0] -> a

  x[1]  -> a + 1

  x[2] -> a + 2

  ........

  x[i] -> a + i

  即

x[0] -> a

  x[1] - 1 -> a

  x[2] - 2 -> a

  .......

  x[i] - i -> a

  也就是要把这些点移动到固定的一个点,那么我们只要求出x[i]-i的中位数,就可以求出x轴移动的最短距离了。

  那么我们就可以这样来做:对x,y排序, 然后再对x进行x[i] = x[i] - i,再排序,去除两个中位数,分别求距离的绝对值即可。

代码:

//poj 1732
#include <stdio.h>
#include <stdlib.h>
#include <math.h>int n;
int *x, *y;int cmp(const void *a, const void *b)
{return *(int *)a - *(int *)b;
}void input()
{int i = 0;
/*FILE *fp;fp = fopen("in.txt","r");if (fp == NULL){printf("FOPEN ERROR\n");return;}
*/scanf("%d",&n);//fscanf(fp,"%d",&n);x = (int *)malloc(sizeof(int)*n);y = (int *)malloc(sizeof(int)*n);while (i < n){scanf("%d%d",x+i,y+i);//fscanf(fp,"%d%d",x+i,y+i);i++;}
}void free_buf()
{free(x);free(y);
}int main()
{int sum = 0, i;int mid_x, mid_y;input();qsort(y,n,sizeof(int),cmp);qsort(x,n,sizeof(int),cmp);for (i = 0; i < n; i++){*(x+i) = *(x+i) - i;}qsort(x,n,sizeof(int),cmp);mid_y = *(y + n/2);mid_x = *(x + n/2);for (i = 0; i < n; i++){sum += abs(*(y+i) - mid_y);sum += abs(*(x+i) - mid_x);}printf("%d\n",sum);free_buf();return 0;}

2013/7/25 23:41

转载于:https://www.cnblogs.com/Jason-Damon/p/3216162.html

poj 1723 中位数相关推荐

  1. POJ 1723 Soldiers (中位数)

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

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

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

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

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

  4. 【POJ 1723 --- SOLDIERS】

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

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

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

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

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

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

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

  8. POJ 1723 SOLDIERS

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

  9. SOLDIERS(POJ 1723)

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

最新文章

  1. oracle的cols,Oracle cols_as_rows 比对数据
  2. 《移动平台开发》第3周学习总结
  3. Spring Boot 2.x 新特性总结及迁移指南
  4. 交互,真的没有你想象的那么重要
  5. 【effective c++】继承与面向对象设计
  6. MySQL修改,表结构大幅修改
  7. 面对安利,谁能笑到最后
  8. FreeBSD tips
  9. ubuntu php 上传大文件失败
  10. 自然数简化到素数:黎曼猜想RiemannHypothesis及其解释(公号回复“黎曼猜想”下载PDF经典收藏版彩标资料)
  11. css字体加粗(dw怎么在css里字体加粗)
  12. 天馈系统驻波比概念,产生的原因,问题现象
  13. minimax算法和Alpha-Beta pruning实现英式跳棋
  14. wps批量删除sheet 批量删除工作簿
  15. UEditor自定义表情包
  16. 我在上海对日外贸公司的经历
  17. 在DX12中使用imgui 鼠标响应问题的解决
  18. 开关电源的开关管一般用MOS管而不是三极管原因
  19. 基于PHP和MySql的学生成绩管理系统(附完整版代码)
  20. how to define the RASIC in a team

热门文章

  1. 麒麟985曝光!华为Mate 30或首发:标配5G 性能大增
  2. 疑似华为P30 Pro样张曝光:10倍变焦依然清晰
  3. 统计订单:复选+全选+计算 的列表
  4. Python 使用requests发送POST请求
  5. 怎么撤销定时说说_武夷山币7省线下预约火爆!名字错了怎么办,附预约问题整理...
  6. 我的docker随笔30:C++程序的自动化构建
  7. Linux系统C/C++通用错误码实现模板
  8. 为啥我从后台查到的值在页面显示的是undefined_【java笔记】046天,作购物车页面,学习JavaScript...
  9. 【ElasticSearch】Es 源码之 RestController 源码解读
  10. 40-400-030-运维-优化-MySQL入门调优脚本tuning-primer的使用