HDU 4932 Miaomiao's Geometry

来源:互联网 发布:sqlserver教程百度云 编辑:程序博客网 时间:2024/05/16 11:22

BC的一道题    做比赛的时候想来想去也没有想出什么样例的结果是浮点值的   所以输出我用了最耿直的 .000   现在想想真是不忍直视

题意 :给你一条线上的很多点   现在要求用长度相同的线段去覆盖所有的点  这边有两个要求   这些点只能被线段的两个端点所覆盖  两两线段之间不能相交 ( 除去端点)问最大的满足条件的线段长度是多少

解题思路: 先给所有点从小到大排序  然后记录两个点之间的差值和这个差值的一半   然后只要依次去填充看是否满足条件 就行了  找出最大值 我这边直接是用了set排除所有重复值并且从大到小去判断  满足了就直接break


#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#include<set>#include<vector>#include<algorithm>using namespace std;#define eps 1e-8set<double> s;double num[60];int n;bool judge(double val){    bool last = false;    for(int i = 1;i < n -1;i++){        if(!last && num[i] - num[i - 1] >= val) last = false;        else if(last && fabs(num[i - 1] + val - num[i]) == 0) last = false;        else if(last && num[i] - num[i - 1] - 2*val >= 0 ) last = false;        else if( num[i + 1] - num[i] >= val) last = true;        else return false;    }    return true;}int main(){    int T;    scanf("%d",&T);    while(T--){        scanf("%d",&n);        for(int i = 0;i < n;i++)  scanf("%lf",&num[i]);        sort(num,num + n);        s.clear();        for(int i = 1;i < n;i++){            s.insert(num[i] - num[i -1]);            s.insert((num[i] - num[i - 1]) / 2.0);        }        double ans = 0.000;        set<double>::iterator  it;        for(it = s.end();it != s.begin();it--){            if(judge(*it)){                ans = *it;break;            }        }        printf("%0.3lf\n",ans);    }    return 0;}






0 0
原创粉丝点击