poj 1723 中位数
最近在看一些中位数的东西,然后顺便也看了些题目。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 中位数相关推荐
- POJ 1723 Soldiers (中位数)
$ POJ~1723~Soldiers $ (中位数) $ solution: $ 这道题说难也不算太难,但是当时自己想的很矛盾.所以还是列一篇题解. 这道题首先比较容易看出来的就是:行和列是两个分开 ...
- G - SOLDIERS POJ - 1723 sort+数学
G - SOLDIERS POJ - 1723 题解 好妙啊! 由于与路径没啥关系,走折线即可 先找出 y 的中位数,全部走到中位数的位置 对 x ,先排序,再构造一个 temp[i] = x[i] ...
- POJ 1723 士兵排队 C语言实现
** POJ 1723 士兵排队 C语言实现 ** ** 原文 ** Description N soldiers of the land Gridland are randomly scattere ...
- 【POJ 1723 --- SOLDIERS】
[POJ 1723 --- SOLDIERS] Description N soldiers of the land Gridland are randomly scattered around th ...
- POJ 1723(中位数+连续排列)
题目大意:有N个士兵,每个士兵开始站的坐标是(x,y),现在使得将N个士兵站在同一个水平线(即所有士兵的y坐标相同)并且x坐标相邻,每个士兵每次可以移动一个位置(分别在x和y方向移动).求出最少的移动 ...
- POJ - 1723 Soldiers 士兵站队 排序+中位数
[问题描述] 在一个划分成网格的操场上,n个士兵散乱地站在网格点上.网格点由整数最表(x,y)表示.士兵可以沿着网格边上.下.左.右移动一步,但在同一时刻一个网格上只能有一名士兵.按照军官的命令,士兵 ...
- 【POJ 1723】SOLDIERS(排序、中位数)
题面:SOLDIERS 题目大意 有 nnn 个士兵,并且知道每个士兵在二维坐标图上的位置. 士兵可以进行移动,但是每个士兵每次只能向上.向下.向左或向右移动一个单位,因此,他的 xxx 或 yyy ...
- POJ 1723 SOLDIERS
原题 Description: 平面直角坐标系中给定n个点, 每一次只能将一个点移动一个单位, 求移动的最小次数使得这n个点位于同一水平线上且全部相邻. Input: n:点的个数(1<= n ...
- SOLDIERS(POJ 1723)
这个题和算法书上的2.22题类似,因此y轴只要求出中位数,然后所有的点都要移动到中位数. x轴的情况有点不同, 想了好久终于想明白了. 首先将x升序排序(因为最终的相对位置是不变的),然后设首个元素的 ...
最新文章
- oracle的cols,Oracle cols_as_rows 比对数据
- 《移动平台开发》第3周学习总结
- Spring Boot 2.x 新特性总结及迁移指南
- 交互,真的没有你想象的那么重要
- 【effective c++】继承与面向对象设计
- MySQL修改,表结构大幅修改
- 面对安利,谁能笑到最后
- FreeBSD tips
- ubuntu php 上传大文件失败
- 自然数简化到素数:黎曼猜想RiemannHypothesis及其解释(公号回复“黎曼猜想”下载PDF经典收藏版彩标资料)
- css字体加粗(dw怎么在css里字体加粗)
- 天馈系统驻波比概念,产生的原因,问题现象
- minimax算法和Alpha-Beta pruning实现英式跳棋
- wps批量删除sheet 批量删除工作簿
- UEditor自定义表情包
- 我在上海对日外贸公司的经历
- 在DX12中使用imgui 鼠标响应问题的解决
- 开关电源的开关管一般用MOS管而不是三极管原因
- 基于PHP和MySql的学生成绩管理系统(附完整版代码)
- how to define the RASIC in a team
热门文章
- 麒麟985曝光!华为Mate 30或首发:标配5G 性能大增
- 疑似华为P30 Pro样张曝光:10倍变焦依然清晰
- 统计订单:复选+全选+计算 的列表
- Python 使用requests发送POST请求
- 怎么撤销定时说说_武夷山币7省线下预约火爆!名字错了怎么办,附预约问题整理...
- 我的docker随笔30:C++程序的自动化构建
- Linux系统C/C++通用错误码实现模板
- 为啥我从后台查到的值在页面显示的是undefined_【java笔记】046天,作购物车页面,学习JavaScript...
- 【ElasticSearch】Es 源码之 RestController 源码解读
- 40-400-030-运维-优化-MySQL入门调优脚本tuning-primer的使用