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
分析
这道题目有几个地方需要注意:
- 最后精确到10-5的要求基本是多余的,只要在结果后面再输出“.00000”;
- 本题使用了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很多次。