数学 + 带权中位数 - SGU 114 Telecasting station
2016-01-07 10:50
411 查看
Telecasting station
Problem's Link
[b]Mean:[/b]百慕大的每一座城市都坐落在一维直线上,这个国家的政府决定建造一个新的广播电视台。
经过了许多次试验后,百慕大的科学家们提出了一个结论:在每座城市的不满意度等于这座城市的市民数与这座城市与广播电视台的距离的乘积.
你需要找到这个一维直线上的一点来建造广播电视台,使得所有城市的不满意度的和最小.
[b]analyse:[/b]
个人觉得应该是加权平均数,然而却是求中位数.
可以这样想:随便挑一个点作为station,左右移动一下看看移动之后能够减少多少不满同时又会增加多少不满就可以做了.
[b]Time complexity: O(N)[/b]
[b]view code[/b]
/**
* -----------------------------------------------------------------
* 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;
}
相关文章推荐
- Python多线程同步---互斥锁
- Java classloader 原理
- 微软自拍应用iOS版发布
- 放出百度接口框架设计思路
- Unity中一键创建常用文件夹
- Unity中一键创建常用文件夹
- eclipse 去掉js验证
- Ajax Security之WebGoat实验 - 2016.01.07
- web services用法
- 我的MYSQL学习心得(一) 简单语法
- 数据库表设计
- linux中 Nginx 常见502错误问题解决办法
- Activity和Service的交互
- 谷歌 计算机视觉 3D Robotic 标定 project tango wing----- 招聘要求
- iOS类别(Category)和扩展(Extension)
- linux 文件系统 (一) 文件系统、文件结构、虚拟文件系统的定义及作用、VFS与文件系统的关系
- hibernate官网
- Java类实例化
- Hibernate框架详解(四)缓存策略+lazy
- 为什么易读懂的代码很重要