poj 1723 中位数】的更多相关文章

最近在看一些中位数的东西,然后顺便也看了些题目.poj 1723不仅要求到水平位置的最短距离和,还要求水平都相邻的排成一排的最短距离和,即士兵都站成一列. 到y轴的距离好办,按y轴坐标排序,求中位数,然后求所有到中位数的距离和. 但是在x上怎么样才能最短呢?百思不得其解啊,最后看了这篇之后,豁然开朗. x轴方向,先把x[]排好序,要想移动的距离最短,那么这时的相对位置肯定不变.那么假设a是这个队列的最左边的x坐标,那么它们的关系就有就有 x[0] -> a x[1]  -> a + 1 x[2…
题目大意: 平面上有N(N<=10000)个点,求这些点变成一条水平线的最小移动步数. 算法讨论: 表示自己太弱弱了,打算从今天开始提高一下智商. 我们考虑,既然是要成一条水平线,那么这条直线的y坐标肯定是所有y的中位数了.这是不用置疑的.所以我们只要求出中位数,然后对y坐标的距离差求下和就可以了. 对于x坐标,我们这样考虑,既然题目要求是最小步数,那么也就是说,这些博士兵在水平位置上的相对位置不变,换个意思说就是 原来三个士兵的x坐标是 -1 5 6,那么在他们移动之后,假设移动成一条直线之后…
题目 http://poj.org/problem?id=1723 题解 带权中位数类型的题目~ 可以先考虑降维,最后集合的y坐标,明显是y坐标的中位数的位置,容易求出y方向的贡献res_y.比较麻烦的是在x坐标上最后是要列成一排,而不是单独的一个点,我们可以假设最后集合的最左边的点是x,采用贪心的策略列出公式:res_x=sum(abs(xi-x-i))(i belongs to [0,n-1]).令zi=xi-i,就转化为res_x=sum(abs(zi-x)),这相当于求zi数列的中位数(…
题目传送门 题目大意:平面上有n个士兵,给出每个士兵的坐标,求出使这些士兵站好所需要的最少移动步数.站好要求:所有士兵y相等,x相邻.即达到 (x,y), (x+1, y), (x+2,y)……的状态.(每行不相邻) $Sol$ 我们很容易能想到,让所有士兵y相等就要把他们都移动到所有士兵y的中位数上.这时可能存在有士兵重合在同一格点的情况.后来x轴的情况: x轴时,先进行一次排序后,假设水平线上的n个点存储在数组a[n]中,则第一个点a[0]最终排序后的位置是addr,a[1]的最终位置是(a…
[题目链接] http://poj.org/problem?id=1723 [算法] 中位数 [代码] #include <algorithm> #include <bitset> #include <cctype> #include <cerrno> #include <clocale> #include <cmath> #include <complex> #include <cstdio> #includ…
1.链接地址: http://bailian.openjudge.cn/practice/1723/ http://poj.org/problem?id=1723 2.题目: 总时间限制: 1000ms 内存限制: 65536kB 描述 N soldiers of the land Gridland are randomly scattered around the country. A position in Gridland is given by a pair (x,y) of integ…
SOLDIERS Time Limit: 1000ms Memory Limit: 10000KB This problem will be judged on PKU. Original ID: 172364-bit integer IO format: %lld      Java class name: Main   N soldiers of the land Gridland are randomly scattered around the country. A position i…
题意:对列数X计算∣Xi – Xj∣组成新数列的中位数. 思路:双重二分搜索 对x排序 如果某数大于 mid+xi 说明在mid后面,这些数的个数小于 n/2 的话说明这个中位数 mid 太大 反之太小 对x 搜索 ,直接用lower_bound实现 解决问题的代码: #include <iostream> #include <stdio.h> #include <algorithm> #include <math.h> using namespace st…
题意: 思路: 这道题坑也不少.. 你准备好脑洞了么? 首先 要认真审题 题目中有说:"没有两头牛的吃草位置是相邻的" 这句话让我们省了很多的事儿 (Discuss里有的大神就入了这个坑了) 然后呢 自然想到了中位数 (不要问我怎么想到的) 但是如果n为偶数怎么办呢 就取两个中间位置的数那段区间呗~ 本以为随便搞搞 n的取值 干啥 n为奇数 找到中间点 n为偶数 找到矩形区间 就像酱紫,就完了呢-. 然而 我想简单了-. 还有几步没有想到 1. 中间的那个点被牛占了怎么办 2. 矩形区…
#include <iostream> #include <algorithm> #define MAXN 10005 using namespace std; struct node { int x; int y; }; node _node[MAXN]; bool op_x(node a,node b) { if(a.x < b.x) { return true; } return false; } bool op_y(node a,node b) { if(a.y &l…