HDU 4667 Building Fence(求凸包的周長)
題目連結:傳送門
題意:
給定n個圓,m個三角形求把這些圖形全部覆蓋的圖形的最小的周長。
分析:
剛開始看到就想到了求凸包,可是圓怎麼求了?就暴力把圓分割成1000個點然後求凸包就可以了。水過了,正解是找圓與圓的切點圓與三角形上的點與圓引得切線的切點。
程式碼如下:
#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<cmath>
#include<iostream>
using namespace std;
typedef long long LL;
const double eps = 1e-10;
const int maxn = 1e6+10;
const double pi = acos(-1.0);
const double inf = 1e17;
int dcmp(double x){
if(fabs(x)<eps) return 0;
if(x>0) return 1;
return -1;
}
struct point{
double x,y;
int id;
point(){}
point(double _x,double _y,int i):x(_x),y(_y),id(i){}
bool operator <(const struct point &tmp)const{
if(dcmp(x-tmp.x)==0) return dcmp(y-tmp.y)<0;
return dcmp(x-tmp.x)<0;
}
bool operator == (const struct point &tmp)const{
return dcmp(x-tmp.x)==0&&dcmp(y-tmp.y)==0;
}
}p[maxn],st[maxn];
double Cross(point a,point b,point c){
return (c.x-a.x)*(b.y-a.y) - (b.x-a.x)*(c.y-a.y);
}
int ConvexHull(point *p,int n,point *st){
sort(p,p+n);
n=unique(p,p+n)-p;
int m=0;
for(int i=0; i<n; i++) {
while(m>1&&Cross(st[m-2],p[i],st[m-1])<=0) m--;
st[m++]=p[i];
}
int k=m;
for(int i=n-2; i>=0; i--){
while(m>k&&Cross(st[m-2],p[i],st[m-1])<=0)m--;
st[m++]=p[i];
}
if(n>1) m--;
return m;
}
double dis(point a,point b){
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
int R[600];
int main()
{
int n,m;
while(~scanf("%d%d",&n,&m)){
int cnt = 0;
for(int i=0;i<n;i++){
double x,y,r;
scanf("%lf%lf%lf",&x,&y,&r);
R[i]=r;
for(int j=0;j<1000;j++){
double tmp = 2*pi*j/1000;
p[cnt++]=point(x+r*cos(tmp),y+r*sin(tmp),i);
}
}
for(int i=0;i<m*3;i++){
double x,y;
scanf("%lf%lf",&p[cnt].x,&p[cnt].y);
p[cnt].id=cnt++;
}
int num = ConvexHull(p,cnt,st);
double ans = 0;
for(int i=0;i<num;i++){
int t1 = st[i].id;
int t2 = st[(i+1)%num].id;
if(t1==t2){
ans+=pi*2*R[t1]/1000;
}
else ans+=dis(st[i],st[(i+1)%num]);
}
printf("%.4lf\n",ans);
}
return 0;
}
相關文章
- HDU 4946 Area of Mushroom(凸包)OOM
- HDU 3685 Rotational Painting(凸包+重心)AI
- 1469C Building a FenceUI
- 求多邊形凸包(線性演算法)--陳氏凸包演算法--演算法
- C#--求圓的面積和周長C#
- UVA 10652 Board Wrapping(計算幾何基礎,求凸包)APP
- Fence RepairAI
- ACM Color the fenceACM
- Codeforces Gym 100286A. Aerodynamics 計算幾何 求二維凸包面積
- SGU 277 Heroes(動態凸包維護)
- Facebook 面試題 | 島的周長面試題
- 求周、月、季、年、紀的函式函式
- 斜率優化(凸包優化)DP問題acm優化ACM
- Leedcode-島嶼的周長
- fence_ipmilan 的一個缺陷MILA
- 簡單的揹包問題(入門)HDU2602 HDU2546 HDU1864
- 周長最長;及找到最大數分析
- HDU 2689 【歸併排序求逆序對】排序
- 【KMP求字串匹配次數】 hdu 1686KMP字串匹配
- POJ 1113-Wall(凸包-Graham演算法)演算法
- 【凸包 Graham法 點集排序】poj 1113 Wall排序
- 螞蟻螞蟻;及周長最長分析
- Java演算法面試題(005) 求n邊形周長的k等分點座標(今日頭條)Java演算法面試題
- 計算幾何(一):凸包問題(Convex Hull)
- [USACO5.1] 圈奶牛Fencing the Cows /【模板】二維凸包
- 為什麼凸問題的解集是凸集
- 3201 圓的周長與面積
- java求學費的增長Java
- win10 fence如何刪除_win10 fence刪除詳細步驟Win10
- 支援https請求以及https請求的抓包HTTP
- Arduino BuildingUI
- Team BuildingUI
- HDU 2689 Sort it【樹狀陣列求逆序對】陣列
- HDU 4911 Inversion(歸併排序求逆序數)排序
- HDU 4643 GSM(計算幾何求線段的中垂線)
- Wireshark的HTTP請求包和響應包如何對應HTTP
- LeetCode 463. 島嶼的周長 JAVALeetCodeJava
- 周大俠啊進擊的JavaScript(四)之閉包JavaScript