Codeforces Gym100971 F.Two Points (IX Samara Regional Intercollegiate Programming Contest Russia, Samara, March 13)
这个题直接推公式就可以。
就是解一元二次方程,用高中学的公式,函数开口向上,求最大值为(4ac-b*b)/4a。
这个题推出来一元二次方程,然后将最大值的公式化简一下。公式很好推。
这个题有疑问,int vx=v11-v1,vy=v22-v2;这样写是对的,反过来写成v1-v11,v2-v22就不对,WA1,但是样例什么的是对的,搞不懂为什么。
代码:
1 #include<cstdio>
2 #include<cstring>
3 #include<iostream>
4 #include<math.h>
5 #include<algorithm>
6 using namespace std;
7 int main(){
8 int x1,y1,x2,y2;
9 int v1,v2,v11,v22;
10 double ans;
11 while(cin>>x1>>y1>>x2>>y2){
12 cin>>v1>>v2>>v11>>v22;
13 int vx=v11-v1,vy=v22-v2;
14 if((y1-y2)*vy+(x1-x2)*vx<0||(vx==0&&vy==0))ans=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
15 else ans=fabs(((x1-x2)*vy-(y1-y2)*vx)/sqrt(vx*vx+vy*vy));
16 printf("%.15f\n",ans);
17 }
18 return 0;
19 }