the 12th UESTC Programming Contest Final Justice is Given by Light (几何+ 二分)
生活随笔
收集整理的這篇文章主要介紹了
the 12th UESTC Programming Contest Final Justice is Given by Light (几何+ 二分)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
題目來源:
http://acm.uestc.edu.cn/#/problem/show/814
題意:是給你一堆凸包上的點,這些點會形成一個凸多邊形,有兩個god站在這個多邊形上,他們可以釋放一個半徑為r的魔法火圈,我們要求的就是兩個god放出來的火圈完全覆蓋這個多邊形時的最小半徑。
我的方法是二分半徑,然后判斷能否覆蓋這個多邊形是枚舉每一條線段,判斷每一條線段是否都能被一個圓,或者兩個圓完全覆蓋,如果能那么這個多邊形就能完全被覆蓋,只有有一條邊不滿足覆蓋, 則這個多邊形不能完全被覆蓋。
其中判斷一條跨兩個圓的線段能否被兩個圓完全覆蓋時,用的二分,去找線段上是否存在一個點,同時在兩個圓內,如果存在則這條線段能被兩個圓完全覆蓋。
代碼如下:
#include <iostream> #include <algorithm> #include <stdlib.h> #include <stdio.h> #include <stack> #include <string> #include <string.h> #include<cstring> #include <algorithm> #include <stdlib.h> #include <vector> #include <set> #include <math.h> #include <cmath> #include <map> #include <queue> using namespace std ; typedef long long LL ; const double EPS = 1e-10; const int Max_N = 25; double add(double x, double y){if (fabs(x+y) < EPS*( fabs(x)+fabs(y)) )return 0;return x+y; } struct Point {double x,y;Point(){}Point(double x, double y):x(x),y(y){}double dist(Point p){return sqrt( (x-p.x)*(x-p.x) + (y-p.y)*(y-p.y) );} }; Point p[Max_N]; Point mag[3]; int n; // 跨圓的線段, 二分尋找是否存在一個點, 同時在2個圓內 int judge(Point l,Point r, Point ml, Point mr, double ra){Point mid;while( fabs(l.dist(r)) > EPS ){mid.x= (l.x + r.x) * 0.5;mid.y= (l.y + r.y) * 0.5;double d1=(ml.dist(mid) - ra);double d2=(mr.dist(mid) - ra);if(d1<=0 && d2<=0)return 1;if(d1 <= 0)l=mid;elser=mid;}return 0; } int judge1(double r){ // 枚舉所有線段,看每條線段是否都能被覆蓋int i,j;for(i=0; i<n-1; i++){for(j=i+1;j<n; j++){double r1,r2,r3,r4;r1=(p[i].dist(mag[1]) - r);r2=(p[j].dist(mag[1]) - r);r3=(p[i].dist(mag[2]) - r);r4=(p[j].dist(mag[2]) - r);if( (r1<= 0 && r2<= 0) || (r3<=0 && r4<=0) )continue;if( r1 <=0 && r4<=0 ){if(judge(p[i] ,p[j],mag[1],mag[2], r)) // judge判斷一條跨線是否被覆蓋continue;}if(r2<=0 && r3<=0){if(judge( p[i],p[j],mag[2],mag[1],r ))continue;}return 0;}}return 1; } int main(){while(~scanf("%d" ,&n)){for(int i=0; i<n; i++)scanf("%lf%lf",&p[i].x, &p[i].y );for(int i=1; i<=2; i++)scanf("%lf%lf",&mag[i].x, &mag[i].y);double ll=0.0, lr=4000.0; // lr不能開太小, 可以開大些double md;while(ll+ EPS <lr ){ //二分半徑md=(ll + lr) * 0.5;if(judge1(md))lr=md;elsell=md;}printf("%.3lf\n",md);} }?
?
轉載于:https://www.cnblogs.com/zn505119020/p/3668277.html
總結
以上是生活随笔為你收集整理的the 12th UESTC Programming Contest Final Justice is Given by Light (几何+ 二分)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: puppet
- 下一篇: 解决非浏览器客户端请求nginx无法命中