您的位置:首页 > 其它

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

2017-02-22 21:32 369 查看
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

,d

,w

;
struct Position{
double x,y,z;
}a
;
double mn
;
bool vis
;
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();
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: