zoukankan      html  css  js  c++  java
  • C. Three Base Stations

    http://codeforces.com/problemset/problem/51/C

    两次二分+贪心, 被卡精度卡了好久,发现整数点的话,结果不是整数就是 xxx.5的直接整数解决,就不会有精度问题啦。

    以后注意利用题目条件, double代码留作纪念。

    View Code
    const int MM = 511111;
    const double esp=1e-8;
    const double lep=0.0000001;
    #define  debug puts("wrong")
    #define clr(a) memset(a,0,sizeof(a))
    int N,M,mm;
    int x[MM];
    double xx[MM];
    
    void get_data() {
        int i,j,k;
        for(i=0;i<N;i++) {
            scanf("%d",&x[i]);
        }
        sort(x,x+N);
        mm=1;
        for(i=1;i<N;i++) if(x[i]!=x[i-1]) x[mm++]=x[i];
        N=mm;
        for(i=0;i<N;i++) xx[i]=(double)(1.0*x[i]);
    //    for(i=0;i<N;i++) printf("%.2lf ",xx[i]); printf("\n");
    }
    int find(double val) {
        int l=0,r=N-1,mid;
        while(l<=r) {
            mid=(l+r)>>1;
            if((xx[mid]-val)>esp) r=mid-1;
            else l=mid+1;
        }
        return l;
    }
    void solve() {
        int i,j,k,id, tt;
        bool ff=false;
        double ans, tmp, sum, d, a0=0.00,a1=0.00,a2=0.00;
        double l=0, r=xx[N-1], mid;
        while((r-l)>esp) {
            d=l+r; mid=d/2.0;
    //        if(!ff) {printf("%lf\n",mid);ff=true;}
            tmp=xx[0]+d;
            a0=xx[0]+mid;
            if(tmp+esp>=xx[N-1]) {r=mid-esp;continue;}
            id=find(tmp); //if(!ff) {printf("%d\n",id);ff=true;}
    
            tmp=xx[id]+d;
            a1=xx[id]+mid;
    
            if(tmp+esp>=xx[N-1]) {r=mid-esp;continue;}
            id=find(tmp);
    //        if((l-0.5)<esp) printf("%d\n",id);
            if(xx[id]+d+esp>=xx[N-1]) {    a2=xx[id]+mid;r=mid-esp;}
            else l=mid+esp;
        }
        printf("%lf\n",l);
        a0=xx[0]+l;
        tmp=xx[0]+(double)(l*2.0);
    //    printf("%lf\n",tmp);
        id=find(tmp);
        if(tmp+lep>=xx[id] && id+1<N) id++;
        a1=xx[id]+l;
        tmp=xx[id]+(double)(l*2.0);
    //    printf("%lf\n", tmp);
        tt=find(tmp);
        if(tmp+lep>=xx[tt] && tt+1<N) tt++;
        a2=xx[tt]+l;
    //    printf("%d %d\n",id,tt);
        printf("%lf %lf %lf\n",a0,a1,a2);
    }
    
    int main() {
        while(scanf("%d",&N)!=EOF) get_data(),solve();
        return 0;
    }
    /*
    6 1 3 100 105 1000 1010
    10 1 2 3 4 5 6 7 8 9 10
    */
  • 相关阅读:
    网站建设怎样添加设为首页和加入收藏代码
    在WEB项目中调用QQ通讯组件打开QQ聊天界面
    网页引用Font Awesome图标
    jQuery鼠标划入划出
    django框架
    python连接数据库:
    数据库:
    TCP:
    数据库:
    Excel在任务栏中只显示一个窗口的解决办法
  • 原文地址:https://www.cnblogs.com/zhang1107/p/3027933.html
Copyright © 2011-2022 走看看