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很多次。