F - ACdream发电站
Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others)
Submit Status
Problem Description
在ACdream王国中,有一条母亲河,这条母亲河为王国人民提供了各种生活用水。在河边共住着n户人家,每户人家的位置为x[i]。由于经济发展需要,ACdream决定在这条母亲河上建立一个水力发电站,经过勘测,这个水力发电站只可以建立在区间[a,b]的某一个地方x0。为了减少大家受到来此发电站的影响,希望min{|x[i]-x0| |0<=i<=n-1}最大,即使得距离发电站最近的人家与发电站的距离最大。若有多组答案,输出坐标较小的即可。
Input
多组数据,对于每组数据,首先是三个整数n(1<=n<=100),a,b(1<=a<=b<=10^9)
接下来是n个整数,表示每户人家的坐标
Output
对于每组数据,输出一个整数,表示最佳发电站的坐标位置。
Sample Input
3 4 9
5 8 14
Sample Output
4
题意:在一个数轴上,有n户人家,在[a,b]之间建一个水电站,求位置,使得水电站离最近的人家距离最大。
分析:最优地点有三种情况。一、端点a。二、端点b。三、相邻两家的中点。
代码:
#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
int main() {
int n, a, b, c[105];
while(scanf("%d%d%d", &n, &a, &b) == 3) {
for(int i = 0; i < n; i++)
scanf("%d", &c[i]);
sort(c, c+n);
int mid = 0, ans, tt;
for(int i = 0; i < n-1; i++) {
if((c[i+1]-c[i]) > mid && (c[i]+c[i+1])/2 > a && (c[i]+c[i+1])/2 < b) {
mid = c[i+1]-c[i];
ans = c[i] + mid/2;
}
}
int ca = 1 << 30, cb = 1 << 30;
for(int i = 0; i < n; i++) {
int x = fabs(a-c[i]);
int y = fabs(b-c[i]);
ca = min(ca, x);
cb = min(cb, y);
}
if(ca >= mid/2 && ca >= cb)
ans = a;
if(cb > mid/2 && cb > ca)
ans = b;
printf("%d\n", ans);
}
return 0;
}