[POJ 1723]SOLDIERS(带权中位数问题)

题目链接:http://poj.org/problem?id=1723

最近因为在为NOIP 2014复习,一直没写啥题解。。。

这个题目的意思是给你n个士兵在棋盘里的坐标,要你将他们排成连续的一行(即与x轴平行),问你最少要将这些士兵移动多少步。

思路:设最终连续的一行的开头坐标为(linex,liney),终点坐标为(linex+n-1,liney)

将x坐标和y坐标分开讨论。

y坐标上,要让士兵移动步数最少,则liney=士兵们的y坐标的中位数

x坐标上士兵的移动步数=|x1-linex|+|(x2-1)-linex|+...+|(xn-n+1)-linex|。

x坐标上求最少移动步数对应的linex就是一个带权中位数问题,我们要找的linex就是这个带权中位数。

对x坐标进行排序,设排序后数组为x1‘,x2‘...xn‘

设tmp数组,tmp1=x1‘-0,tmp2=x2‘-(2-1),....tmpn=xn‘-(n-1)

对tmp数组再排序,linex就是tmp数组的中位数。

剩下求最少移动步数的过程很简单就不多废话了

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <algorithm>
#include <cmath>

#define MAXN 10005

using namespace std;

int x[MAXN],y[MAXN];

int main()
{
    int n,liney,linex,ans=0;
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
    {
        scanf("%d%d",&x[i],&y[i]);
    }
    sort(y+1,y+n+1);
    liney=y[(n+1)/2];
    for(int i=1;i<=n;i++)
        ans+=abs(y[i]-liney);
    sort(x+1,x+n+1);
    for(int i=1;i<=n;i++)
    {
        x[i]=x[i]-i;
    }
    sort(x+1,x+n+1);
    linex=x[(n+1)/2];
    for(int i=1;i<=n;i++)
    {
        ans+=abs(x[i]-linex);
    }
    printf("%d\n",ans);
    return 0;
}



时间: 2024-10-28 13:27:12

[POJ 1723]SOLDIERS(带权中位数问题)的相关文章

poj 1723 SOLDIERS 带权中位数

题目 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数列的中位数(

中位数及带权中位数题集

codevs 3625 1 #include <bits/stdc++.h> 2 using namespace std; 3 int x[11111], y[11111]; 4 int main() 5 { 6 int n; scanf("%d", &n); 7 for(int i = 1; i <= n; i++) scanf("%d %d", &x[i], &y[i]); 8 ///先处理y 9 sort(y + 1,

A Bug&#39;s Life POJ - 2492 (带权并查集)

A Bug's Life POJ - 2492 Background Professor Hopper is researching the sexual behavior of a rare species of bugs. He assumes that they feature two different genders and that they only interact with bugs of the opposite gender. In his experiment, indi

[总结]中位数及带权中位数问题

目录 一.中位数问题 1. 问题模型 2. 结论 3. 推导 4. 例题 二.带权中位数问题 1. 问题模型 2. 结论 3. 推导 4. 例题 一.中位数问题 1. 问题模型 数轴\(x\)上有\(n\)个点,现在给出这\(n\)个点的坐标\(a[i](i\in [1,n])\),让你选择一个点\(k(k\in [1,n])\),使得每个点到点\(k\)的距离之和最小. 2. 结论 点\(k\)为序列的中位数时最优: 若n为奇数,点\(k\)位于a[(n+1)/2]处最优:若n为偶数,点\(k

带权中位数

话说在3085年,外星人打算来入侵地球,这个消息被我国的情报部门秘密截获,于是便打算联系世界各个国家,一 起研究商量对策.由于每个国家所需派的技术员人数不同,所以目前无法决定到底要在哪个国家设置个研究所进行 研究,幸运的是所有国家都在一条直线上,现在知道每个国家与我国的距离和该国的研究员人数.请你为他们决定 一下到底在那个国家建立研究所可以使所有研究员集中到该国的费用最小. Input 输入文件每一行描述一个国家的信息. 首先是该国派出的技术员人数,紧跟着的是这个城市相对于我国的距离,最后是国家

POJ 1723 SOLDIERS (中位数)

题目大意: 平面上有N(N<=10000)个点,求这些点变成一条水平线的最小移动步数. 算法讨论: 表示自己太弱弱了,打算从今天开始提高一下智商. 我们考虑,既然是要成一条水平线,那么这条直线的y坐标肯定是所有y的中位数了.这是不用置疑的.所以我们只要求出中位数,然后对y坐标的距离差求下和就可以了. 对于x坐标,我们这样考虑,既然题目要求是最小步数,那么也就是说,这些博士兵在水平位置上的相对位置不变,换个意思说就是 原来三个士兵的x坐标是 -1 5 6,那么在他们移动之后,假设移动成一条直线之后

POJ 1182 食物链 带权并查集

动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种. 有人用两种说法对这N个动物所构成的食物链关系进行描述: 第一种说法是"1 X Y",表示X和Y是同类. 第二种说法是"2 X Y",表示X吃Y. 此人对N个动物,用上述两种说法,一句接一句地说出K句话,这K句话有的是真的,有的是假的.当一句话满足下列三条之一时,这句话就是假话,否

POJ 1182 食物链 (带权并查集 &amp;&amp; 向量偏移)

题意 : 中文题, 直接去POJ  1182看即可 分析 : 通过普通并查集的整理归类, 能够单纯地知道某些元素是否在同一个集合内.但是题目不仅只有种类之分, 还有种类之间的关系, 即同类以及吃与被吃, 而且重点是题目问的并不是种类是否在一个集合内, 而是考察给出的关系是否矛盾.在解释之前, 先明白一个问题, 对于给出的关系, 如果我不能通过前面的信息来推断出来, 是不是不能够判断现在给出关系的对错?那就将这个信息作为真命题并存储起来, 方便后面判断.有了刚刚前面的陈述, 可以知道两个东西=>

数学 + 带权中位数 - SGU 114 Telecasting station

Telecasting station Problem's Link Mean: 百慕大的每一座城市都坐落在一维直线上,这个国家的政府决定建造一个新的广播电视台. 经过了许多次试验后,百慕大的科学家们提出了一个结论:在每座城市的不满意度等于这座城市的市民数与这座城市与广播电视台的距离的乘积. 你需要找到这个一维直线上的一点来建造广播电视台,使得所有城市的不满意度的和最小. analyse: 个人觉得应该是加权平均数,然而却是求中位数. 可以这样想:随便挑一个点作为station,左右移动一下看看