日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【计算几何】【预处理】【枚举】Urozero Autumn Training Camp 2016 Day 5: NWERC-2016 Problem K. Kiwi Trees...

發(fā)布時間:2023/12/31 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【计算几何】【预处理】【枚举】Urozero Autumn Training Camp 2016 Day 5: NWERC-2016 Problem K. Kiwi Trees... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

發(fā)現由于角的度數和邊的長度有限制,那倆圓如果放得下的話,必然是塞在兩個角里。

于是預處理n個圓心的位置(注意要判斷那個圓會不會和其他的邊界相交),然后n^2枚舉倆角即可。

#include<cstdio> #include<cmath> using namespace std; #define EPS 0.00000001 struct Point{double x,y;double length(){return sqrt(x*x+y*y);} }a[2010]; typedef Point Vector; Vector unit(Vector v){double l=v.length();return (Vector){v.x/l,v.y/l}; } Vector operator - (const Point &a,const Point &b){return (Vector){a.x-b.x,a.y-b.y}; } Vector operator + (const Point &a,const Point &b){return (Vector){a.x+b.x,a.y+b.y}; } double dot(const Vector &a,const Vector &b){return a.x*b.x+a.y*b.y; } double Cross(const Vector &a,const Vector &b){return a.x*b.y-a.y*b.x; } Vector operator * (const double &K,const Vector &v){return (Vector){K*v.x,K*v.y}; } int n; Point calc(int I){double jiao=acos(dot(a[I+1]-a[I],a[I-1]-a[I])/(a[I+1]-a[I]).length()/(a[I-1]-a[I]).length());double d=4000.0/tan(jiao/2.0);double l=4000.0/sin(jiao/2.0);Point p1=a[I]+d*unit(a[I+1]-a[I]);Point p2=a[I]+d*unit(a[I-1]-a[I]);Point M=(Point){(p1.x+p2.x)/2.0,(p1.y+p2.y)/2.0};return a[I]+l*unit(M-a[I]); } double DisToSegment(Point P,Point A,Point B) {Vector v1=B-A,v2=P-A,v3=P-B;if(dot(v1,v2)<EPS) return v2.length();else if(dot(v1,v3)>EPS) return v3.length();else return fabs(Cross(v1,v2))/v1.length(); } Point yuanxins[2010]; bool can[2010]; int main(){ // freopen("k.in","r",stdin);scanf("%d",&n);for(int i=1;i<=n;++i){scanf("%lf%lf",&a[i].x,&a[i].y);}a[++n]=a[1];for(int i=n;i>=1;--i){a[i+1]=a[i];}a[1]=a[n];++n;for(int i=2;i<n;++i){yuanxins[i]=calc(i);can[i]=1;for(int j=2;j<n;++j){ // double tmp=DisToSegment(yuanxins[i],a[j],a[j+1]);if(DisToSegment(yuanxins[i],a[j],a[j+1])-4000.0<-EPS){can[i]=0;break;}}}for(int i=2;i<n;++i){if(Cross(a[i+1]-a[i],a[i]-a[i-1])>EPS && can[i]){Point A=yuanxins[i];for(int j=i+1;j<n;++j){if(Cross(a[j+1]-a[j],a[j]-a[j-1])>EPS && can[j]){Point B=yuanxins[j]; // double tmp=(B-A).length();if((B-A).length()-8000.0>-EPS){printf("%.8f %.8f\n%.8f %.8f\n",A.x,A.y,B.x,B.y);return 0;}}}}}puts("impossible");return 0; }

轉載于:https://www.cnblogs.com/autsky-jadek/p/7198403.html

總結

以上是生活随笔為你收集整理的【计算几何】【预处理】【枚举】Urozero Autumn Training Camp 2016 Day 5: NWERC-2016 Problem K. Kiwi Trees...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。