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 product of citizens amount in it by distance between city and TV-station. Find such point on Ox axis for station so that sum of displeasures of all cities is minimal.

Berland的每个城市都在Ox轴上。这个国家的政府决定建立一个新的广播电视站。经过很多次的实验以后,Berland的科学家得出了一个结论:所有城市的不满意度等于城市数乘以它们到广播电视站的距离。在Ox轴上找到这样的一个广播电视站使得所有城市不满意度最低。

Input

输入

Input begins from line with integer positive number N (0<N<15000) – amount of cities in Berland. Following N pairs (X, P) describes cities (0<X, P<50000), where X is a coordinate of city and P is an amount of citizens. All numbers separated by whitespace(s).

输入第一行包含一个正数N (0 < N < 15000) ——表示Berland的城市数。接下来N对 (X, P) 描述城市 (0 < X, P < 50000),其中X是城市的坐标,P表示城市数。所有的数字以空格分隔。

Output

输出

Write the best position for TV-station with accuracy 10-5.

输出广播电视站的最佳位置,精确到10-5

Sample Input

样例输入

4

1 3

2 1

5 2

6 2

Sample Output

样例输出

3.00000

Analysis

分析

这道题目有几个地方需要注意:

  1. 最后精确到10-5的要求基本是多余的,只要在结果后面再输出“.00000”;
  2. 本题使用了Special Judge,因此答案可能不唯一。

有了上面两点的认识,我们来考虑一般的解决方案。我们不妨考虑电视台建在城市中,很容易证明,这也是这个问题的一个解。

我们不妨把所有的城市列出来,比如样例输入中,一共有8个城市,我们把它们认为是不同的,并且列成一排:

(1, 1)、(1, 2)、(1, 3)、(2, 4)、(5, 5)、(5, 6)、(6, 7)、(6, 8)

其中第一个数字表示城市的位置,第二个数字表示第几个城市。很容易发现,我们需要求的是最中间的那个城市。

如果城市数目为奇数,那么我们所需要求的就是第S / 2 + 1个城市,其中S表示城市总数。

如果城市数目为偶数,那么我们可以输出第S / 2个城市或第S / 2 + 1个城市,为了方便起见,我们都取第S / 2 + 1个城市,这并不会对答案的这正确性产生影响。

Solution

解决方案

#include <iostream>
#include <algorithm>
#include <vector>

using namespace std;

struct City
{
	City(int _P = 0, int _M = 0)
	{ P = _P; M = _M; }

	int P, M;
};

int cmp(City x, City y)
{ return x.P < y.P; }

vector<City> pCity;

int main()
{
	int N, P, M;
	while(cin >> N)
	{
		int nCnt = 0;
		pCity.clear();
		for(int i = 1; i <= N; i++)
		{
			cin >> P >> M;
			pCity.push_back(City(P, M));
			nCnt += M;
		}
		sort(pCity.begin(), pCity.end(), cmp);
		int nTmp = nCnt / 2 + 1;
		int nPos = 0;
		for(; nTmp > 0; nPos++)
		{
			if(nTmp - pCity[nPos].M > 0) { nTmp -= pCity[nPos].M; }
			else { break; }
		}
		cout << pCity[nPos].P << ".00000" << endl;
	}
	return 0;
}

  

这道题目主要是一开始说明的两点要注意一下,否则会WA很多次。

时间: 2024-10-07 06:55:18

SGU[114] Telecasting station的相关文章

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

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

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

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

SGU 114

分析得,选取的电视塔的位置应当位于各城市的加权中位数位置的右边最近的城市位置. 理由:对于上述位置A,假设它右边城市+它本身的人数为rp,它左边城市的人数为lp,由定义rp>=lp. 所以,如果向左移动D距离,则右边城市不满意度增加D*rp,左边减少D*lp<=D*rp,不合算. 同理,向右移动D距离时,同样有D*rp<=D*lp,不合算. 所以,上述位置为最佳位置. 输出时应注意输出格式:有五位小数. #include "stdio.h" #include &quo

sgu100~199题解

老东西了..发上来吧.. Sgu题解系列  南开中学邹事成 100:A+B略 101:Domino 给n块多米诺骨牌,每张骨牌两端各有从1到6的一个数字,现在要把这些骨牌排成一列,使相邻的两块骨牌相对的面所写的数字一样. 可以把每一块多米诺骨牌想象成一条边,把面上写的数字抽象成点,比如一块骨牌正面写的1反面写的2就想象成连了一条从1到2的边,那么这就是求一条有重边的欧拉回路了,dfs一下即可. 102:Coprimes给定n求从1到n中与n互质的数的个数. 可以把n质因数分解后直接代入欧拉函数.

中位数及带权中位数题集

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,

poj2031(Building a Space Station)

题目地址:Building a Space Station 题目大意: 在一个三维的空间里有若干个球体,求从走过所有球花费最少,题目要求两个球体接触就不需要建桥意为花费为0,实力给吃的n行, 其中包括 球的X,Y,Z的坐标,r为球的半径.这里就清晰了,意思就是求无向图最小生成树,val就为两个求圆心的距离减去两个球的半径. 解题思路: 建图,dijstra求最小生成树,记住双向的和eps处理精度. 代码: 1 #include <algorithm> 2 #include <iostre

SGU 438 The Glorious Karlutka River =) 拆点+动态流+最大流

The Glorious Karlutka River =) Time Limit:500MS     Memory Limit:262144KB     64bit IO Format:%I64d & %I64u Submit Status Practice SGU 438 Appoint description: Description A group of Mtourists are walking along the Karlutka river. They want to cross

1072. Gas Station (30)

先要求出各个加油站 最短的 与任意一房屋之间的 距离D,再在这些加油站中选出最长的D的加油站 ,该加油站 为 最优选项 (坑爹啊!).如果相同D相同 则 选离各个房屋平均距离小的,如果还是 相同,则 选 编号小的. 时间限制 200 ms 内存限制 65536 kB 代码长度限制 16000 B 判题程序 Standard 作者 CHEN, Yue A gas station has to be built at such a location that the minimum distance

sgu Kalevich Strikes Back

这道题就是求一个大矩形被n个矩形划分成n+1个部分的面积,这些矩形之间不会相交,可能包含.. 1 #include <cstdio> 2 #include <cstring> 3 #include <vector> 4 #include <algorithm> 5 #define maxn 120100 6 using namespace std; 7 8 long long s[maxn]; 9 vector<int>g[maxn]; 10 i