NC16606. 最短路2
描述
输入描述
输入的第一行包含一个整数T,表示测试组数。
每个测试用例前面都有一个空白行。
每个测试用例由包含整数Ax,Ay,Bx,By和有理数P,Q,R。
输出描述
对于每个测试用例输出一个数:表示求A走到B的最短路长度,结果保留三位小数。
示例1
输入:
2 2 0 -1 1 1.0 1.0 1.0 -2 3 4 -1 1.0 -0.1 0.47
输出:
3.414 10.000
C++14(g++5.4) 解法, 执行用时: 3ms, 内存消耗: 472K, 提交时间: 2018-08-07 09:59:33
#include<bits/stdc++.h> using namespace std; const int maxn=500; double x[10],y[10]; double dis(int i,int j) { return sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j])); } void solve() { for(int i=0;i<2;i++) scanf("%lf%lf",&x[i],&y[i]); double ans=fabs(x[0]-x[1])+fabs(y[0]-y[1]); double p,q,r;scanf("%lf%lf%lf",&p,&q,&r); if(p!=0&&q!=0) { x[2]=x[0];y[2]=(r-p*x[2])/q;double dis02=fabs(y[2]-y[0]); y[3]=y[0];x[3]=(r-q*y[3])/p;double dis03=fabs(x[3]-x[0]); x[4]=x[1];y[4]=(r-p*x[4])/q;double dis14=fabs(y[4]-y[1]); y[5]=y[1];x[5]=(r-q*y[5])/p;double dis15=fabs(x[5]-x[1]); ans=min(ans,dis02+dis14+dis(2,4)); ans=min(ans,dis02+dis15+dis(2,5)); ans=min(ans,dis03+dis14+dis(3,4)); ans=min(ans,dis03+dis15+dis(3,5)); } printf("%.3f\n",ans); } int main() { int T;scanf("%d",&T); while(T--)solve(); return 0; }
C++11(clang++ 3.9) 解法, 执行用时: 3ms, 内存消耗: 460K, 提交时间: 2018-10-01 14:48:09
#include<cstdio> #include<algorithm> #include<cmath> using namespace std; typedef long long ll; int T; double x[6],y[6],p,q,r; double dis(int i,int j) { return sqrt(1.0*(x[i]-x[j])*(x[i]-x[j])+1.0*(y[i]-y[j])*(y[i]-y[j])); } int main() { scanf("%d",&T); while(T--) { scanf("%lf%lf%lf%lf%lf%lf%lf",&x[0],&y[0],&x[1],&y[1],&p,&q,&r); double ans=fabs(x[0]-x[1])+fabs(y[0]-y[1]); if(p!=0&&q!=0) { x[2]=x[0],y[2]=(r-p*x[0])/q; x[3]=(r-q*y[0])/p,y[3]=y[0]; x[4]=x[1],y[4]=(r-p*x[1])/q; x[5]=(r-q*y[1])/p,y[5]=y[1]; for(int i=2;i<=3;i++) for(int j=4;j<=5;j++) ans=min(ans,dis(0,i)+dis(i,j)+dis(j,1)); } printf("%.3f\n",ans); } return 0; }