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。请计算最少需要多少体力。

输入

第一行五个正整数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 的圆。

输出

仅一行一个实数表示答案。与标准答案的绝对误差或者相对误差不超过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
",ans);
    else printf("Kuon
");

    return 0;
}
View Code

 

原文地址:https://www.cnblogs.com/Kissheart/p/9751057.html