http://202.197.224.59/OnlineJudge2/index.php/Problem/read/id/1175
| (2013湘潭邀请赛题目) Hurry Up | ||
| Accepted : 62 |
| Submit : 251 |
| Time Limit : 1000 MS |
| Memory Limit : 65536 KB |
| Problem Description GG is some what afraid of his MM. Once his MM asks, he will always try his best to rush to their home. Input Multiple test cases. First line, an integer T ( 1 ≤ T ≤ 2000 ), indicating the number of test cases. Ouput For each test case, output a real number with 2 digits after the arithmetic point. It is the shorest time for GG to reach home. Sample Input 2 1 1 2 2 1 2 1 1 2 2 1 7 Sample Output 1.41 1.32
XTU OnlineJudge |
[ Submit Solution ]
//正解一
memory time length
1064 KB 31 MS 1123 B
#include<string.h>
#include<stdio.h>
#include<math.h>
#include<algorithm>
#include <iostream>
using namespace std;
const double ep=1e-10;
double vr,vt;
double xt,x2;
double y2,yt;
double lenth(double a1,double b1,double a2,double b2)
{
return sqrt((a1-a2)*(a1-a2)+(b1-b2)*(b1-b2));
}
double caltime(double x)
{
return (lenth(xt,yt,x,0)/vr+lenth(x2,y2,x,0)/vt);
}
int main()
{
int T,i;
double t1,t2,r,l;
while(scanf("%d",&T)!=EOF)
{
for(i=0;i<T;i++)
{
scanf("%lf%lf%lf%lf",&xt,&yt,&x2,&y2);
scanf("%lf%lf",&vr,&vt);
t1=lenth(xt,yt,x2,y2)/vr;
r=xt;
l=x2;
for(int i=0;i<100;i++)//这么多是参考某位大神的
{ double m1=l + (r-l)/3;
double m2=r - (r-l)/3;
if(caltime(m1)<=caltime(m2)) r=m2;
else l=m1;
}
t2=caltime(l);
t1=t1<t2? t1:t2;
printf("%.2lf\n",t1);
}
}
return 0;
}
正解二:/
枚举法
memory time length
1256 KB 593 MS 1176 B
//枚举法,枚举到0.1
#include<string.h>
#include<stdio.h>
#include<math.h>
#include<algorithm>
#include <iostream>
using namespace std;
const double ep=1e-10;
double vr,vt;
double xt,x2;
double y2,yt;
double lenth(double a1,double b1,double a2,double b2)
{
return sqrt((a1-a2)*(a1-a2)+(b1-b2)*(b1-b2));
}
double caltime(int x)
{ (double)x;
return (lenth(xt,yt,x,0)/vr+lenth(x2,y2,x,0)/vt);
}
int main()
{
int T,i,j;
double t1,t2,min,max,t;
while(scanf("%d",&T)!=EOF)
{
for(i=0;i<T;i++)
{
scanf("%lf%lf%lf%lf",&xt,&yt,&x2,&y2);
xt=xt*10.0;
yt=yt*10.0;
x2=x2*10.0;
y2=y2*10.0;
scanf("%lf%lf",&vr,&vt);
vr=vr*10.0;
vt=vt*10.0;
t1=lenth(xt,yt,x2,y2)/vr;
max=xt>x2? xt:x2;
min=xt<x2? xt:x2;
t2=1000000.0;
for(j=(int)min;j<=(int)max;j++)
{
t=caltime(j);
if(t2>t)
t2=t;
}
t1=t1<t2? t1:t2;
printf("%.2lf\n",t1);
}
}
return 0;
}
错误:
//三分法
#include<string.h>
#include<stdio.h>
#include<math.h>
#include<algorithm>
#include <iostream>
using namespace std;
const double ep=1e-10;
double vr,vt;
double xt,x2;
double y2,yt;
double lenth(double a1,double b1,double a2,double b2)
{
return sqrt((a1-a2)*(a1-a2)+(b1-b2)*(b1-b2));
}
double caltime(double x)
{
return (lenth(xt,yt,x,0)/vr+lenth(x2,y2,x,0)/vt);
}
double solve(double l,double r)//三分法
{
double m;
double mm;
while(l+ep<r)
{
m=(l+r)/2.0;
mm=(m+r)/2.0;
if(caltime(m)<caltime(mm))//取最小值
r=mm;
else
l=m;
}
return l;
}
int main()
{
int T,i;
double t1,t2;
while(scanf("%d",&T)!=EOF)
{
for(i=0;i<T;i++)
{
scanf("%lf%lf%lf%lf",&xt,&yt,&x2,&y2);
scanf("%lf%lf",&vr,&vt);
t1=lenth(xt,yt,x2,y2)/vr;
t2=caltime(solve(xt,x2));
t1=t1<t2? t1:t2;
printf("%.2lf\n",t1);
}
}
return 0;
}

本文介绍了一道算法题目,探讨了如何计算从任意位置到目的地的最短时间,包括直接跑步和乘坐出租车两种方式。提供了两种解决方案,一种是通过三分法进行优化,另一种是通过枚举法求解。
1315

被折叠的 条评论
为什么被折叠?



