码迷,mamicode.com
首页 > 其他好文 > 详细

acdream 1716(贪心)

时间:2015-05-07 08:48:12      阅读:125      评论:0      收藏:0      [点我收藏+]

标签:

题意:
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
题解:先判断如果坐标都在a左边,那结果一定是b,同理如果坐标都在b右边,结果一定是a,然后如果只有一个点,那一定是距离两个端点更远的那个端点是解。剩下情况就是枚举两个点得到它们的中点,如果在a和b中间,就直接计算更新最大的最小值,否则是最近的那个端点当解,然后更新最大的最小值,注意要先把a和b当解的答案先算出来当做解和最大距离的初始值,保证解是最优的。

#include <stdio.h>
#include <cmath>
#include <algorithm>
using namespace std;
const int INF = 0x3f3f3f3f;
const int N = 105;
int n, a, b, pos[N];

int main() {
    while (scanf("%d%d%d", &n, &a, &b) == 3) {
        for (int i = 0; i < n; i++)
            scanf("%d", &pos[i]);
        if (n == 1) {
            printf("%d\n", abs(pos[0] - a) > abs(pos[0] - b) ? a : b);
            continue;
        }
        sort(pos, pos + n);
        if (pos[0] >= b) {
            printf("%d\n", a);
        }
        else if (pos[n - 1] <= a) {
            printf("%d\n", b);
        }
        else {
            int res, maxx = 0, temp = abs(pos[0] - a);
            for (int i = 1; i < n; i++)
                temp = min(abs(pos[i] - a), temp);
            if (temp > maxx) {
                res = a;
                maxx = temp;
            }
            temp = abs(pos[0] - b);
            for (int i = 1; i < n; i++)
                temp = min(abs(pos[i] - b), temp);
            if (temp > maxx) {
                res = b;
                maxx = temp;
            }
            for (int i = 0; i < n; i++) {
                for (int j = i + 1; j < n; j++) {
                    int mid = (pos[i] + pos[j]) / 2;
                    if (mid < a)
                        mid = a;
                    else if (mid > b)
                        mid = b;
                    if (mid >= a && mid <= b) {
                        int temp = abs(pos[0] - mid);
                        for (int k = 1; k < n; k++)
                            temp = min(abs(pos[k] - mid), temp);
                        if (temp > maxx) {
                            res = mid;
                            maxx = temp;
                        }
                    }
                }
            }
            printf("%d\n", res);
        }
    }
    return 0;
}

acdream 1716(贪心)

标签:

原文地址:http://blog.csdn.net/hyczms/article/details/45549105

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!