首页 > 其他 > 详细

POJ 2728 Desert King [最优比率生成树]

时间:2017-02-22 22:20:22      阅读:248      评论:0      收藏:0      [点我收藏+]

RT


 

我想哭

我想哭

我想哭

我想哭

我想哭

我想哭

我想哭

我想哭

我想哭

我想哭

我想哭

我想哭


 

凭什么!一模一样的代码一个TLE一个AC,改小二分范围和精度才过

凭什么!

我眼睁睁的看着那段代码复制之前复制之后一模一样!

凭什么!

 

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int N=1005;
const double eps=1e-4,INF=1e9;
inline int read(){
    char c=getchar();int x=0,f=1;
    while(c<0||c>9){if(c==-)f=-1; c=getchar();}
    while(c>=0&&c<=9){x=x*10+c-0; c=getchar();}
    return x*f;
}
int n;
double c[N][N],d[N][N],w[N][N];
struct Position{
    double x,y,z;
}a[N];
double mn[N];
bool vis[N];
bool check(double mid){//printf("check %lf\n",mid);
    for(int i=1;i<=n;++i)
        for(int j=1;j<=n;++j) 
            w[i][j]=c[i][j]-d[i][j]*mid;
    memset(vis,0,sizeof(vis));memset(mn,127,sizeof(mn));mn[1]=0;
    for(int i=1;i<=n;++i){
        int k=0;
        for(int j=1;j<=n;++j) if(!vis[j]&&mn[j]<mn[k]) k=j;
        vis[k]=1;
        for(int j=1;j<=n;++j) if(!vis[j]&&w[j][k]<mn[j]) mn[j]=w[j][k];
    }
    double re=0;
    for (int i=1;i<=n;++i) re+=mn[i];
    return re<0;
}

void solve(){
    double l=0,r=1e2;
    while(r-l>eps){
        double mid=(l+r)/2.0;
        if(check(mid)) r=mid;
        else l=mid;
    }
    printf("%.3f\n",l);
}
int main(){
    freopen("in","r",stdin);
    while(scanf("%d",&n)!=EOF&&n){
        for(int i=1;i<=n;i++) a[i].x=read(),a[i].y=read(),a[i].z=read();
        if(n==1) {puts("0.000");continue;}
        for(int i=1;i<=n;i++) 
            for(int j=1;j<=n;++j) 
                c[i][j]=abs(a[i].z-a[j].z),
                d[i][j]=sqrt((a[i].x-a[j].x)*(a[i].x-a[j].x)+(a[i].y-a[j].y)*(a[i].y-a[j].y));
        solve();
    }
}

 

POJ 2728 Desert King [最优比率生成树]

原文:http://www.cnblogs.com/candy99/p/6431123.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!