您的位置:首页 > 其它

【BZOJ 1857】[Scoi2010]传送带 三分套三分

2017-01-18 21:58 323 查看
很多细节,可以当一个版

#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
#include<cstdlib>
using namespace std;
const double eps=1e-7;
struct node{
double x,y;
}A,B,C,D,aa,bb,cc,dd;
double v[5];
bool dcmp(double a,double b){return fabs(a-b)<=eps;}
double sqr(double x){return x*x;}
double T(double a,double b,double x,double y,int d){
return sqrt(sqr(x-a)+sqr(y-b))/v[d];
}

double calc(double a,double b){
node t1,t2;double ans1,ans2;
C=cc,D=dd;
while(!dcmp(C.x,D.x)||!dcmp(C.y,D.y)){
t1.x=(C.x-D.x)/3.0+D.x,t1.y=(C.y-D.y)/3.0+D.y;
t2.x=(C.x-D.x)/3.0*2+D.x,t2.y=(C.y-D.y)/3.0*2+D.y;

ans1=T(aa.x,aa.y,a,b,1)+T(a,b,t1.x,t1.y,2)+T(t1.x,t1.y,dd.x,dd.y,3);
ans2=T(aa.x,aa.y,a,b,1)+T(a,b,t2.x,t2.y,2)+T(t2.x,t2.y,dd.x,dd.y,3);

if(ans1<ans2)C=t2;else D=t1;
}
return T(aa.x,aa.y,a,b,1)+T(a,b,t1.x,t1.y,2)+T(t1.x,t1.y,dd.x,dd.y,3);
}

int main(){
scanf("%lf%lf%lf%lf",&A.x,&A.y,&B.x,&B.y);
scanf("%lf%lf%lf%lf",&C.x,&C.y,&D.x,&D.y);
aa.x=A.x,aa.y=A.y,dd.x=D.x,dd.y=D.y;
bb.x=B.x,bb.y=B.y,cc.x=C.x,cc.y=C.y;
scanf("%lf%lf%lf",&v[1],&v[3],&v[2]);
while(!dcmp(A.x,B.x)||!dcmp(A.y,B.y)){
node t1,t2;
t1.x=(A.x-B.x)/3.0+B.x,t1.y=(A.y-B.y)/3.0+B.y;
t2.x=(A.x-B.x)/3.0*2+B.x,t2.y=(A.y-B.y)/3.0*2+B.y;
double len1=calc(t1.x,t1.y),len2=calc(t2.x,t2.y);
if(len1<len2)A=t2;else B=t1;
}
printf("%.2lf",calc(A.x,A.y));
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: