1. 程式人生 > >牛客國慶集訓派對Day1L-New Game!

牛客國慶集訓派對Day1L-New Game!


題解:
數學知識+最短路
CodeCode:

#include<bits/stdc++.h>
using namespace std;
const int N=1e3+3,inf=1e9;
int n,a,b,c1,c2,x[N],y[N],r[N],tot,head[N*N],vis[N];
double dist[N];
priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > >Q;
double max(double X,double Y)
{
    return X>Y?X:Y;
}
double Abs(double a)
{
    return a>0?a:-a;
}
struct node
{
    int vet,next;
    double len;
}edge[N*N];
void add(int u,int v,double w)
{
    edge[++tot].vet=v;
    edge[tot].next=head[u];
    head[u]=tot;
    edge[tot].len=w;
}
void work(int X,int Y)
{
    double len=max((double)0,(double)(sqrt(Abs((double)(y[Y]-y[X]))*Abs((double)(y[Y]-y[X]))+Abs((double)(x[X]-x[Y]))*Abs((double)(x[X]-x[Y])))-r[X]-r[Y]));
    add(X,Y,len);add(Y,X,len);
}
inline int read()
{
    int x=0,f=1;
    char s=getchar();
    while(s>'9'||s<'0'){if(s=='-')f=-1;s=getchar();}
    while(s<='9'&&s>='0'){x=x*10+s-'0';s=getchar();}
    return x*f;
}
int main()
{
    n=read(),a=read(),b=read(),c1=read(),c2=read();
    memset(head,-1,sizeof(head));
    for(int i=1;i<=n;i++)
    {
        x[i]=read();y[i]=read();r[i]=read();
    }
    for(int i=1;i<n;i++)
        for(int j=i+1;j<=n;j++)
        {
            work(i,j);
        }
    double len;
    for(int i=1;i<=n;i++)
    {
        len=max((double)0,Abs((double)(a*x[i]+b*y[i]+c1)/(double)(sqrt(a*a+b*b)))-r[i]);
        add(0,i,len);add(i,0,len);
        len=max((double)0,Abs((double)(a*x[i]+b*y[i]+c2)/(double)(sqrt(a*a+b*b)))-r[i]);
        add(n+1,i,len);add(i,n+1,len);
    }
    for(int i=0;i<=n+1;i++)
    {
        dist[i]=inf;
    }
    dist[0]=0;
    Q.push(make_pair(dist[0],0));
    while(!Q.empty())
    {
        int u=Q.top().second;
        vis[u]=1;
        Q.pop();
        for(int i=head[u];i!=-1;i=edge[i].next)
        {
            int v=edge[i].vet;
            if(dist[u]+edge[i].len<dist[v]&&!vis[v])
            {
                dist[v]=dist[u]+edge[i].len;
                Q.push(make_pair(dist[v],v));
            }
        }
    }
    printf("%.10lf",dist[n+1]);
    return 0;
}

相關推薦

國慶集訓派對Day1L-New Game!

題解: 數學知識+最短路 Code:Code:Code: #include<bits/stdc++.h> using namespace std; const int N=1e3+3,inf=1e9; int n,a,b,c1,c2,x[N],y[

國慶集訓派對Day1 New Game!+計算幾何

題目連結:https://www.nowcoder.com/acm/contest/201/L 題目大意:給你n個圓和兩條直線,在圓上,和圓內和直線上行走不消耗體力。 在其他位置上由S點走到T點消耗的體力為S和T的歐幾里得距離。Hifumi Takimoto想從 L1 出發,走到 L2 。請

國慶集訓派對Day1___L New Game!——最短路

題目連結:傳送門 題目大意:     給出兩條平行線和nnn個圓,計算從一條線走到另一條線所消耗的體力。同時,在線上、圓上、園內走不消耗體力,求體力的最小花費。 解題思路:     一開始沒想到是最短路,後來仔細一想,除了最短路也沒啥其他的了。將線和圓都想象成一

國慶集訓派對Day1 L New Game!(SPFA)

題意: 有兩條直線,n個圓,讓你從一條直線走到另外一條直線,問你最少需要花費多少消耗 這裡在線上、圓內、圓上走路都不會產生消耗,在其他位置上由S點走到T點消耗的體力為S和T的歐幾里得距離。 解析: 寫這道題我就想吐槽一下這道題噁心的卡常...... 我一開始用最

國慶集訓派對Day1 L New Game!(最短路spfa)

差一點就在一條錯誤的方向越走越遠了 竟然是最短路  太強了 #include<bits/stdc++.h> using namespace std; const int maxn=1e3+10; const int N=1e6+100; con

國慶集訓派對Day1 L-New Game!(最短路)

時間限制:C/C++ 1秒,其他語言2秒 空間限制:C/C++ 1048576K,其他語言2097152K Special Judge, 64bit IO Format: %lld 題目描述 Eagle Jump公司正在開發一款新的遊戲。Hifumi Takimoto

國慶集訓派對Day1 L New Game!

這個題是一個最短路的練習; 我們將每一個圓心看成一個連線點,將他們的路徑連線起來,求距離的時候需要注意(在圓內,圓上,線上它們的距離是0) 當兩個圓相離它們的距離就是兩點之間的距離減去兩點的半徑,如果是一個負值說明兩個圓是相交的,那麼它們的距離就是0; 剩下的就是一

國慶集訓派對Day4 F - NTT

題目連結:點選這裡   解題思路: f(x)的i階導可以寫為:                              

國慶集訓派對Day6 J 最短路

文章目錄 題目 解析 題目 解析 從原圖中扣出來一個樹,然後求LCA的ST表 對於多餘的邊,可以對於每個邊上的點都跑一遍最短路,然後求經過這個點查詢的u,v的最短路 OK! // 以

國慶集訓派對Day2 H 卡牌遊戲 [ 期望dp ]

題目描述 小貝喜歡玩卡牌遊戲。某個遊戲體系中共有N種卡牌,其中M種是稀有的。小貝每次和電腦對決獲勝之後都會有一個抽卡機會,這時系統會隨機從N種卡中選擇一張給小貝。普通卡可能多次出現,而稀有卡牌不會被重複抽到。小貝希望收集到K種稀有卡牌,她想知道期望需要多少次獲勝才能實現這個目標。

國慶集訓派對Day2 H 卡牌遊戲【期望】

連結:https://www.nowcoder.com/acm/contest/202/H 來源:牛客網   時間限制:C/C++ 1秒,其他語言2秒 空間限制:C/C++ 1048576K,其他語言2097152K Special Judge, 64bit IO Format:

國慶集訓派對Day2 F 平衡二叉樹【遞推】

時間限制:C/C++ 1秒,其他語言2秒 空間限制:C/C++ 1048576K,其他語言2097152K 64bit IO Format: %lld 題目描述  平衡二叉樹,顧名思義就是一棵“平衡”的二叉樹。在這道題中,“平衡”的定義為,對於樹中任意一個節點,都滿足左右子樹的

國慶集訓派對Day2 A 矩陣乘法(思維分塊)

題目連結 題意: 給你兩個矩陣A,B, A是n*p,B是p*m,B是一個只有0,1組成的矩陣,Aij<65536 C=A*B,讓你求出C的裡面所有元素的異或和   解析: 官方的標解是分塊,每8個分一組。 例如對於A,每行行每8個分成一組,對於B,

國慶集訓派對Day1 C Utawarerumono(暴力)

題目連結 題意: 關於變數x,y的不定方程ax+by=c,顯然這個方程可能有多個整數解。Kuon想知道如果有解,使得p2*x2+p1*x+q2*y2+q1*y最小的一組整數解是什麼。為了方便,你只需要輸出p2*x2+p1*x+q2*y2+q1*y的最小值。 如果方程無整數解,輸出“Kuo

國慶集訓派對Day2: H. travel(樹形線頭DP)

連結:https://ac.nowcoder.com/acm/contest/140/H 來源:牛客網   題目描述 White Cloud has a tree with n nodes.The root is a node with number 1. Each nod

國慶集訓派對Day1 Princess Principal

求區間內的括號串是否符合條件 預處理括號串,a[i]記錄當長度為i時的不符合長度(字首),查詢時比較a[l-1]和a[r]是否相同即可 #include<bits/stdc++.h> using namespace std; const int MAX=1

國慶集訓派對Day1 A思維 C暴力 E貪心 L最短路

A Code: #include <bits/stdc++.h> using namespace std; const int AX = 1e6 + 66; int a[AX] ; map&

國慶集訓派對Day1(A、C、E、L)

#pragma GCC optimize(2) #include <bits/stdc++.h> using namespace std; #define clr(a) memset(a,0,sizeof(a)) #define line cout<&l

[國慶集訓派對Day1] C[數學] L[最短路] J[線段樹]

時間限制:C/C++ 1秒,其他語言2秒 空間限制:C/C++ 1048576K,其他語言2097152K 64bit IO Format: %lld 題目描述 算術是為數不多的會讓Kuon感到棘手的事情。通常她會找Haku幫忙,但是Haku已經被她派去買東西

國慶集訓派對Day1 I Steins;Gate(FFT+原根)

思路:求出p的原根,那麼乘法就變成了加法,FFT跑一下,下標在稍微轉換一下就好了。 #include <cstdio> #include <cstdlib> #include <cstring> #include <bitset