Gym - 100851F Froggy Ford kruskal

題目鏈接:

http://acm.hust.edu.cn/vjudge/problem/307216

Froggy Ford


Time Limit: 3000MS

題意

青蛙過河,河中有若干個石頭,現在你可以加一個石頭,使得青蛙從左岸跳到右岸的最大跳躍距離最小。

題解

把左岸和右岸作為兩個虛節點,用kruskal的思路處理出每個點到左岸需要跳躍的最大距離st[i](最優情況下)和每個點到右岸的最大距離ed[i],然后枚舉兩個點,在這兩個點的中點放一個石頭,得到ma=max(st[i],ed[j],dis(i,j)/2),如果這個值比答案更優,就更新答案,同時記錄新放的石頭的坐標。

代碼

#include<map>
#include<cmath>
#include<queue>
#include<vector>
#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
#define X first
#define Y second
#define mkp make_pair
#define lson (o<<1)
#define rson ((o<<1)|1)
#define mid (l+(r-l)/2)
#define sz() size()
#define pb(v) push_back(v)
#define all(o) (o).begin(),(o).end()
#define clr(a,v) memset(a,v,sizeof(a))
#define bug(a) cout<<#a<<" = "<<a<<endl
#define rep(i,a,b) for(int i=a;i<(b);i++)typedef long long LL;
typedef vector<int> VI;
typedef pair<int,int> PII;
typedef vector<pair<int,int> > VPII;const int INF=0x3f3f3f3f;
const LL INFL=9e18;
const double eps=1e-8;const int maxn=1111;LL w,n;pair<LL,LL> pt[maxn];LL dis(LL x1,LL y1,LL x2,LL y2){return (x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);
}struct Edge{int u,v; LL w;Edge(int u,int v,LL w):u(u),v(v),w(w){}Edge(){}bool operator < (const Edge& tmp) const {return w<tmp.w;}
}egs[maxn*maxn];int tot;
int fa[maxn];
int find(int x){return fa[x]=fa[x]==x?x:find(fa[x]);
}vector<int> G[maxn];
int st[maxn],ed[maxn];void init(){clr(st,-1);clr(ed,-1);tot=0;rep(i,0,maxn) fa[i]=i;rep(i,0,maxn) G[i].push_back(i);
}int main() {freopen("froggy.in","r",stdin);freopen("froggy.out","w",stdout);init();scanf("%I64d%I64d",&w,&n);rep(i,1,n+1) scanf("%I64d%I64d",&pt[i].X,&pt[i].Y);rep(i,1,n+1){egs[tot++]=Edge(0,i,pt[i].X*pt[i].X);}rep(i,1,n+1){egs[tot++]=Edge(i,n+1,(w-pt[i].X)*(w-pt[i].X)); }rep(i,1,n+1){rep(j,i+1,n+1){egs[tot++]=Edge(i,j,dis(pt[i].X,pt[i].Y,pt[j].X,pt[j].Y));}}egs[tot++]=Edge(0,n+1,w*w);egs[tot++]=Edge(0,0,0);egs[tot++]=Edge(n+1,n+1,0);sort(egs,egs+tot);rep(i,0,tot){int u=egs[i].u,v=egs[i].v;if(u==0&&v==0){st[0]=i; continue;}if(u==n+1&&v==n+1){ed[n+1]=i; continue;}int pu=find(u);int pv=find(v);if(pu!=pv){if(find(0)==pu){rep(j,0,G[pv].size()){int tt=G[pv][j];st[tt]=i;}}else if(find(0)==pv){rep(j,0,G[pu].size()){int tt=G[pu][j];st[tt]=i;}}if(find(n+1)==pu){rep(j,0,G[pv].size()){int tt=G[pv][j];ed[tt]=i;}}else if(find(n+1)==pv){rep(j,0,G[pu].size()){int tt=G[pu][j];ed[tt]=i;}}fa[pv]=pu;while(G[pv].size()>0){G[pu].push_back(G[pv][G[pv].sz()-1]);G[pv].pop_back();}}}int ans_i=0,ans_j=0;double mi=9000000000000000000;rep(i,0,n+2){rep(j,0,n+2){if(i==j) continue;double tmp=max(egs[st[i]].w,egs[ed[j]].w);int ti=i,tj=j;if(ti>tj) swap(ti,tj);if(ti==0&&tj==n+1){tmp=max(tmp,w*w*1.0/4);}else if(ti==0){tmp=max(tmp,pt[tj].X*pt[tj].X*1.0/4);}else if(tj==n+1){tmp=max(tmp,(w-pt[ti].X)*(w-pt[ti].X)*1.0/4);}else{tmp=max(tmp,dis(pt[i].X,pt[i].Y,pt[j].X,pt[j].Y)*1.0/4);}if(tmp<mi){mi=tmp;ans_i=i; ans_j=j;}}}double ans_x=0,ans_y=0;if(ans_i>ans_j) swap(ans_i,ans_j);if(ans_i==0&&ans_j==n+1){ans_x=w*1.0/2;ans_y=0;}else if(ans_i==0){ans_x=pt[ans_j].X*1.0/2;ans_y=pt[ans_j].Y;}else if(ans_j==n+1){ans_x=(w+pt[ans_i].X)*1.0/2;ans_y=pt[ans_i].Y;}else{ans_x=(pt[ans_i].X+pt[ans_j].X)*1.0/2;ans_y=(pt[ans_i].Y+pt[ans_j].Y)*1.0/2; }printf("%.3lf %.3lf\n",ans_x,ans_y);return 0;
}

轉載于:https://www.cnblogs.com/fenice/p/5769356.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/256594.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/256594.shtml
英文地址,請注明出處:http://en.pswp.cn/news/256594.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Tesseract入門-VS2015下調用Tesseract4.0 +win7 64位系統

本文是基于最近的OCR識別項目學習ocr開源庫-tesseract的簡單調用&#xff0c;不涉及其余視覺知識。 參考文獻&#xff1a;http://blog.csdn.net/u012566751/article/details/54136836 參考庫&#xff1a;http://download.csdn.net/download/u010554381/10044876 1.預備工作 …

authconfig命令解析_學習筆記

時間&#xff1a;2017.11.16作者&#xff1a;李強參考&#xff1a;man,info&#xff0c;magedu講義聲明&#xff1a;以下英文純屬個人翻譯&#xff0c;英文B級&#xff0c;歡迎糾正&#xff0c;盜版不糾,才能有限&#xff0c;希望不誤人子弟為好。1、使用目的與場景先列在這里&…

matlab simulinK筆記06——代數環

★代數環 代數環,就是由于模型的輸出反饋到模塊或子系統的某個輸入端&#xff0c;如果這個輸入 是直接饋入的&#xff0c;那么二者在同一個采樣點內需得到求解&#xff0c;但又互相依賴,哪一方都不 能完成求解過程&#xff0c;使得解算器無法解算導致錯誤產生&#xff0c;這樣的…

PHP多種序列化/反序列化的方法 (轉載)

1. serialize和unserialize函數 這兩個是序列化和反序列化PHP中數據的常用函數。 <?php$a array(a > Apple ,b > banana , c > Coconut);//序列化數組 $s serialize($a); echo $s; //輸出結果&#xff1a;a:3:{s:1:"a";s:5:"Apple";s:1:&qu…

基于python3的Opencv(一)-打開攝像頭顯示圖像

基于Python3的Opencv學習&#xff1a; import cv2 as cv def video_demo(): #0是代表攝像頭編號&#xff0c;只有一個的話默認為0capturecv.VideoCapture(0) while(True):ref,framecapture.read()cv.imshow("1",frame) #等待30ms顯示圖像&#xff0c;若過程中按“Esc…

.Net中的AOP系列之《方法執行前后——邊界切面》

返回《.Net中的AOP》系列學習總目錄 本篇目錄 邊界切面 PostSharp方法邊界方法邊界 VS 方法攔截ASP.NET HttpModule邊界真實案例——檢查是否為移動端用戶真實案例——緩存小結本系列的源碼本人已托管于Coding上&#xff1a;點擊查看。 本系列的實驗環境&#xff1a;VS 2013 Up…

matlab simulink筆記06 —— 利用simulink求解微分方程/simulink框圖與控制系統框圖的區別

目錄 1.利用integrator求解微分方程 1.1求解步驟 1.2例子 2.simulink框圖與控制系統框圖的區別 本人剛開始學習simulink,總是會將simulink框圖和控制系統框圖混淆,導致最后不能正確的根據simulink框圖得到相應的微

ubuntu搭建svn、git遇到的問題及解決辦法

不錯的git筆記博客&#xff1a; http://www.cnblogs.com/wanqieddy/category/406859.html http://blog.csdn.net/zxncvb/article/details/22153019 Git學習教程&#xff08;六&#xff09;Git日志 http://fsjoy.blog.51cto.com/318484/245261/ 圖解git http://my.oschina.net/x…

PHP IDE phpstorm 快捷鍵

這篇文章主要介紹了PHP IDE phpstorm 常用快捷鍵,本文分別列出了mac系統和Windows系統下的phpstorm快捷鍵,需要的朋友可以參考下 一、mac電腦phpstorm快捷鍵 command a 全選 command c 復制 command v 粘貼 command z 撤消 command k 代碼搜索 command l 輸入行號跳到某一…

Opencv SolvePnP調用實戰

1.環境說明與應用說明 VS2015opencv3.4&#xff0c;實際應用在MFC環境中&#xff01;主要是用來做定位&#xff0c;利用平面靶標給機器人的工具快換提供定位信息 2.實際調用 CV_EXPORTS_W bool solvePnP( InputArray objectPoints, InputArray imagePoints, …

matlab simulink筆記05 —— 積分模塊

1.連續積分模塊&#xff1a;integrator 例子見&#xff1a;matlab simulink筆記06 —— 利用simulink求解微分方程/simulink框圖與控制系統框圖的區別

squid在企業網中的應用

一&#xff1a;squid簡介&#xff1a; Squid是一種在Linux系統下使用的優秀的代理服務器軟件。Squid是一個緩存internet數據的一個軟件&#xff0c;它接收用戶的下載申請&#xff0c;并自動處理所下載的數據。也就是說&#xff0c;當一個用戶想要下載一個主頁時&#xff0c;它向…

win10+tensorflow faster-RCNN 訓練自己的數據集

首先&#xff0c;感謝博客上各路大佬的無私奉獻&#xff01;但是也不得不吐槽下&#xff0c;大佬些寫博客的時候能盡量寫的對小白友好一點嗎&#xff1f;期間遇到各種坑&#xff0c;說多了都是淚啊&#xff01;話不多說&#xff0c;上正題&#xff01; 環境&#xff1a;win10a…

matlab simulnk筆記07——模塊(接地模塊group、終止模塊terminal、信號合并mux與分解模塊demux)

1.接地模塊group 2.終止模塊terminal 3.信號合并mux 注意:合并僅僅指的是物理上的合并,數學上真正意義上的合并,只是將多個信號放在同一個管道上統一傳輸給顯示終端,但是每個信號之間互不影響,是相

二叉搜索樹的插入與刪除圖解

一、二叉搜索樹&#xff08;BSTree&#xff09;的概念 二叉搜索樹又被稱為二叉排序樹&#xff0c;那么它本身也是一棵二叉樹&#xff0c;那么滿足以下性質的二叉樹就是二叉搜索樹&#xff1a;1、若左子樹不為空&#xff0c;則左子樹上左右節點的值都小于根節點的值2、若它的右子…

AlienVault Ossim各版本鏡像下載地址

AlienVault Ossim各版本鏡像下載地址 OSSIM V5.0.3 ISO網盤下載地址 了解Ossim的架構、工作原理和使用方法可以參考我的新書以及http://edu.51cto.com/course/course_id-1186.html 這里提供的視頻教程。 本文轉自 李晨光 51CTO博客&#xff0c;原文鏈接&#xff1a;http://blo…

面試總結

lru算法&#xff1a;最近最少使用  1.新數據插入到鏈表頭部&#xff1b;  2.每當緩存命中&#xff08;即緩存數據被訪問&#xff09;&#xff0c;則將數據移到鏈表頭部&#xff1b;  3.當鏈表滿的時候&#xff0c;將鏈表尾部的數據丟棄。 自定義控件&#xff1a; 1.measu…

win10+anaconda安裝tensorflow和keras遇到的坑小結

win10下利用anaconda安裝tensorflow和keras的教程都大同小異&#xff08;針對CPU版本&#xff0c;我的gpu是1050TI的MAX-Q&#xff0c;不知為啥一直沒安裝成功&#xff09;&#xff0c;下面簡單說下步驟。 一 Anaconda安裝 一般來說&#xff0c;python選擇3.6的&#xff0c;目…

rman備份恢復命令之switch

一 switch 命令 1 switch命令用途 更新數據文件名為rman下鏡像拷貝時指定的數據文件名 更新數據文件名為 set newname 命令指定的名字。 2 switch 命令使用前提條件 rman 必須連接到目標數據庫 當switch tablespaces、datafiles、tempfiles時&#xff0c;這些文件必須離線 當…