acdream 1716(贪心)

题意:

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;
}
时间: 2025-01-03 19:00:00

acdream 1716(贪心)的相关文章

acdream 1717(贪心)

题意: Problem Description ACdream王国有一条贯穿整个王国的高速公路,一天,你要驾驶着一辆油箱容量为P的车从高速公路的一头驶向另一头,总路程为L千米,每单位体积的汽油可维持行驶W千米,显然路途遥远~总有不够油的情况,所以就要加油~! 再高速公路上总共有N个加油站,但是由于是不同人开的,因此定价也参差不齐. 现在你知道每个加油站的位置,以及每个加油站的单价,问你最少需要多少钱才能到达另一头? Input 多组数据,每组数据首先是四个整数,P(1<=P<=100),L(1

acdream 1212(贪心)

题意:有n个人,从1到n,编号越大职位越低,然后给出了第2到第n个人的上司的编号,每个人可以有一堆小弟但只能有一个上司.年底发奖金,每个人可以从上司那得到1000元或发给某个小弟1000元,问所有人能发的奖金和最大是多少,那些人得到了奖金. 题解:直接倒着遍历一遍,把人和他的上司标记掉算作一组,看有几组. #include <stdio.h> #include <string.h> const int N = 500005; int pa[N], n, flag[N]; int m

acdream 1073(贪心)

题意: 战机分为升级和进阶两种. 升级:提升战机的等级,但战机品质不变. 进阶:可将战机提升一个星级(白二星->绿三星->蓝四星->紫五星). 为了简化问题,规定战机进阶规则如下: 白色二星: 起始等级Lv1级,满级Lv25级. Lv1升级到Lv25,总共需要A经验. 进阶到绿色三星条件:满级Lv25后,方可进阶. 绿色三星: 起始等级Lv25级,满级Lv30级. Lv25升级到Lv30,总共需要B经验. 进阶到蓝色四星条件:满级Lv30后,方可进阶. 蓝色四星: 起始等级Lv30级,满

acdream 1224(贪心)

题意:有n个抢劫者抢劫了m块金子,然后第i个人平分xi/y块金子,但是会有除不尽的情况而金子不可再分,那么每个人都有一个不满意度fabs(xi / y - ki/m),ki是每个人实际分得的金子数量,要保证所有人的不满意度和最小,问ki应如何分配. 题解:如果可以除尽,ki就是xi * m / y,否则要把不满意度和再多分一块金子的不满意度的差值存起来,按从大到小排序,把多出来的金子数量num给前num个人多分一块. #include <cstdio> #include <cstring

POJ 1716 Integer Intervals#贪心

(- ̄▽ ̄)-* //求一个集合,这个集合与任意一个区间的交集,需至少有两个数字 //贪心过程:按n个区间的最右值从小到大对区间进行排列, //集合首先取第一个区间的最右两个数字, //到第二个区间,判断集合里的数有没有在区间里 //没有的话,就从第二个区间的最右开始往左取(cnt=0取最后两个数,cnt=1取最后一个数) #include<iostream> #include<cstdio> #include<cstring> #include<algorith

acdream 1735 输油管道 贪心

输油管道 Time Limit: 20 Sec  Memory Limit: 256 MB 题目连接 http://acdream.info/problem?pid=1735 Description 平面上有n个油井,现在要建立一条主干线,用来把所有的油井产出的原油都输送出去,主干线是平行于x轴的一条直线,每个油井通过一条支线把原油输送到主干线上,现在给定n个油井在平面上的坐标,那么应该把主干线建在什么地方才能让所有的支干线的总长度最小呢? A的某一段完全重合,或者能够经过上下左右平移与折线A的

ACDream 1734 Can you make a water problem?(贪心)

Can you make a water problem? Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others) Submit Statistic Next Problem Problem Description Losanto want to make a water problem. But he have no idea….Then he thought a problem: A b

ACdream 1224 Robbers (贪心)

Robbers Special Judge Time Limit: 2000/1000MS (Java/Others) Memory Limit: 128000/64000KB (Java/Others) Problem Description N robbers have robbed the bank. As the result of their crime they chanced to get M golden coins. Before the robbery the band ha

[ACdream 1212 New Year Bonus Grant]贪心

题意:员工之间形成一棵树,上级可以给下级发奖金,任何一个人最多可以给一个下级发,并且发了奖金后就不能接受奖金.求总共最多可以产生多少的奖金流动 思路:每次选择没有下级并且有上级的员工a,令它的上级为b,那么让b给a发奖金,之后把a和b从树中删掉,这样处理直到不存在这样的员工a.也就是说每次让叶子员工接受奖金.简单证明:对于最优情况,叶子和它的兄弟集合还有它的父亲一定有一个接受了奖金,否则可以选叶子接受从父亲发的奖金,这样比原来增加了1个奖金:假设父亲接受了奖金或者兄弟接受了奖金,那么换成自己接收