upc 9519 New Game
New Game
时间限制: 1 Sec 内存限制: 128 MB Special Judge提交: 157 解决: 53
[提交] [状态] [讨论版] [命题人:admin]
题目描述
Eagle Jump公司正在开发一款新的游戏。泷本一二三作为其员工,获得了提前试玩的机会。现在她正在试图通过一个迷宫。
这个迷宫有一些特点。为了方便描述,我们对这个迷宫建立平面直角坐标系。迷宫中有两条平行直线 L1:Ax+By+C1=0,L2:Ax+By+C2=0,还有 n 个圆 。角色在直线上、圆上、圆内行走不消耗体力。在其他位置上由S点走到T点消耗的体力为S和T的欧几里得距离。
泷本一二三想从L1出发,走到L2。请计算最少需要多少体力。
这个迷宫有一些特点。为了方便描述,我们对这个迷宫建立平面直角坐标系。迷宫中有两条平行直线 L1:Ax+By+C1=0,L2:Ax+By+C2=0,还有 n 个圆 。角色在直线上、圆上、圆内行走不消耗体力。在其他位置上由S点走到T点消耗的体力为S和T的欧几里得距离。
泷本一二三想从L1出发,走到L2。请计算最少需要多少体力。
输入
第一行五个正整数n,A,B,C1,C2(1≤n≤1000,−10000≤A,B,C1,C2≤10000),其中A,B 不同时为 0。
接下来 n 行每行三个整数x,y,r(−10000≤x,y≤10000,1≤r≤10000) 表示一个圆心为 (x,y),半径为 r 的圆。
接下来 n 行每行三个整数x,y,r(−10000≤x,y≤10000,1≤r≤10000) 表示一个圆心为 (x,y),半径为 r 的圆。
输出
仅一行一个实数表示答案。与标准答案的绝对误差或者相对误差不超过10-4即算正确。
样例输入
2 0 1 0 -4
0 1 1
1 3 1
样例输出
0.236068
题意
给一些圆和两个平行线,在圆内、圆上和线上走不消耗体力,其它消耗的体力为两点之间的几何距离。
分析
看出来是最短路就很简单了,直接建图跑最短路就可以了。
/// author:Kissheart /// #include<stdio.h> #include<algorithm> #include<iostream> #include<string.h> #include<vector> #include<stdlib.h> #include<math.h> #include<queue> #include<deque> #include<ctype.h> #include<map> #include<set> #include<stack> #include<string> #define INF 0x3f3f3f3f #define FAST_IO ios::sync_with_stdio(false) const double PI = acos(-1.0); const double eps = 1e-6; const int MAX=1e5+10; const int mod=1e9+7; typedef long long ll; using namespace std; #define gcd(a,b) __gcd(a,b) inline ll lcm(ll a,ll b){return a/gcd(a,b)*b;} inline ll qpow(ll a,ll b){ll r=1,t=a; while(b){if(b&1)r=(r*t)%mod;b>>=1;t=(t*t)%mod;}return r;} inline ll inv1(ll b){return qpow(b,mod-2);} inline ll exgcd(ll a,ll b,ll &x,ll &y){if(!b){x=1;y=0;return a;}ll r=exgcd(b,a%b,y,x);y-=(a/b)*x;return r;} inline ll read(){ll x=0,f=1;char c=getchar();for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;for(;isdigit(c);c=getchar()) x=x*10+c-'0';return x*f;} //freopen( "in.txt" , "r" , stdin ); //freopen( "data.txt" , "w" , stdout ); ll p1,p2; ll q1,q2; ll a,b,c; int main() { int flag=0; scanf("%lld%lld%lld",&a,&b,&c); scanf("%lld%lld%lld%lld",&p1,&p2,&q1,&q2); ll ans=1e18,x,y; for(ll i=-1e5;i<=MAX;i++) { if((c-a*i)%b==0) { x=i; y=(c-a*i)/b; flag=1; ans=min(ans,p2*x*x+p1*x+q2*y*y+q1*y); } } if(flag) printf("%lld\n",ans); else printf("Kuon\n"); return 0; }