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

Telecasting station

Problem‘s Link



Mean:

百慕大的每一座城市都坐落在一维直线上,这个国家的政府决定建造一个新的广播电视台。

经过了许多次试验后,百慕大的科学家们提出了一个结论:在每座城市的不满意度等于这座城市的市民数与这座城市与广播电视台的距离的乘积.

你需要找到这个一维直线上的一点来建造广播电视台,使得所有城市的不满意度的和最小.

analyse:

个人觉得应该是加权平均数,然而却是求中位数.

可以这样想:随便挑一个点作为station,左右移动一下看看移动之后能够减少多少不满同时又会增加多少不满就可以做了.

Time complexity: O(N)

view code

/**
* -----------------------------------------------------------------
* Copyright (c) 2016 crazyacking.All rights reserved.
* -----------------------------------------------------------------
*       Author: crazyacking
*       Date  : 2016-01-07-09.46
*/
#include <queue>
#include <cstdio>
#include <set>
#include <string>
#include <stack>
#include <cmath>
#include <climits>
#include <map>
#include <cstdlib>
#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
using namespace std;
typedef long long(LL);
typedef unsigned long long(ULL);
const double eps(1e-8);

const int MAXN=15010;
struct N
{
   double x;
   int p;
} a[MAXN];
int b[MAXN];

int cmp(N a,N b)
{
   return a.x<b.x;
}
int main()
{
   int n;
   while(scanf("%d",&n)!=EOF)
   {
       memset(b,0,sizeof(b));
       for(int i=0; i<n; i++)
           scanf("%d%d",&a[i].x,&a[i].p);
       sort(a,a+n,cmp);
       int s=0;
       for(int i=0; i<n; i++)
       {
           s+=a[i].p;
           b[i]=s;
       }
       int mid=s/2,w;
       for(int i=0; i<n; i++)
       {
           if(b[i]>=mid)
           {
               w=i;
               break;
           }
       }
       printf("%d\n",a[w].x);
   }
   return 0;
}

时间: 2024-10-28 06:24:24

数学 + 带权中位数 - SGU 114 Telecasting station的相关文章

SGU[114] Telecasting station

Description 描述 Every city in Berland is situated on Ox axis. The government of the country decided to build new telecasting station. After many experiments Berland scientists came to a conclusion that in any city citizens displeasure is equal to prod

SGU 114. Telecasting station 三分or找中位数

题目链接点这儿 一開始想都没想...直接上了三分...结果...sample的答案不一样...可是过了...然后又看了看. . . 发现这不就是高中或者初中出过的求中位数的题么. . .直接找到这些的中位数即可了....假设某一点处人口不止一个.那就把它拆成一个一个的点. 然后求中位数. 嗯... 这题就结束了. . . 至于三分的过程,事实上就是二分略微改进的版本号.二分仅仅能求单调的函数,假设函数在定义域内不是单调的,那么二分就失效了.当然. ..这时能够用数学上的无穷分逼近,通过分成若干小

中位数及带权中位数题集

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,

[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|

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

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

目录 一.中位数问题 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 输入文件每一行描述一个国家的信息. 首先是该国派出的技术员人数,紧跟着的是这个城市相对于我国的距离,最后是国家

Putting Boxes Together CodeForces - 1030F (带权中位数)

#include <iostream> #include <algorithm> #include <cstdio> #include <math.h> #include <set> #include <map> #include <queue> #include <string> #include <string.h> #include <bitset> #define REP(i,a

POJ 1182 食物链 [并查集 带权并查集 开拓思路]

传送门 P - 食物链 Time Limit:1000MS     Memory Limit:10000KB     64bit IO Format:%I64d & %I64u Submit Status Practice POJ 1182 Appoint description:  System Crawler  (2015-01-27) Description 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1-N编号.每个动物