給定乙個n,代表有n個點,給出n個座標,以每個座標為圓心畫圓。要求:①相鄰的兩個點畫的圓必須相切(第i個和第i+1個,及第乙個點和最後乙個點)②所有圓的面積之和最小。
注:半徑可以為0。
如果n為奇數,通過列方程可以知道,那麼就可以直接求r1,然後 r[i]=dist[i-1]-r[i-1] 依次把所有的r求出來,檢驗一下①是否有r是負數,②r[1]+r[n]是否等於dist[n]; 如果n是偶數,列完方程後會發現,不能像n為奇數一樣把r1用d1、d2...表示出來,則說明r1是不確定的,那麼所有的r也不確定。(可以舉個n=4的梨子,和n=3比較比較)那麼答案我們無法直接求出,但可能存在乙個最大值,用三分法求即可。
#include #include #include #include #include #include #include #include #include #include #include #include #include #define clr(str,x) memset(str,x,sizeof(str))
#define frer() freopen("in.txt","r",stdin);
#define frew() freopen("out.txt","w",stdout);
#define inf 0x3f3f3f3f
#define maxn 10100
typedef long long int ll;
using namespace std;
const double pi =acos(-1.0);
double r[maxn],dist[maxn];
int n;
struct node
nodes[maxn];
double getdist(node a,node b)
double f(double r1)
return sum;
}double sanfen(double& l,double& r)
return f(l)
}int main()
dist[n]=getdist(nodes[n],nodes[1]);
if(n&1)
r[1]=s0/2;
for(int i=2; i<=n; i++)
if(r[1]+r[n]!=dist[n])
isyes=0;
}else
if(t1-t2!=0)
else
else
}double r1;
r1=sanfen(l,r);
f(r1);}}
for(int i=1;i<=n;i++)
if(r[i]<0)
isyes=false;
if(!isyes)
printf("impossible\n");
else
ans*=pi;
printf("%.2lf\n",ans);
for(int i=1; i<=n; i++)
printf("%.2lf\n",r[i]);}}
return 0;
}
HDU 5531 Rebuild 相切的圓們
終於迎來了長春的重現。賽場上太多的遺憾,比賽的時候唯一看都沒看一眼的題就是這個題,太可惜了。連同b題一起,為了搶個fb對不住打重現賽的童鞋們了。求放過,也不知道這個時候寫題解算不算違規呢哈哈。題意 按順序給出乙個多邊形,以多邊形的每個頂點為圓心作圓,使得任意兩相鄰點對應的圓相切,求所有圓面積總和的最...
HDU 5531 幾何公式
include include include include using namespace std const int maxn 1e4 5 const double inf 1e20 const double pi acos 1 const double eps 1e 8 struct poi...
HDU 5531 平面幾何 三分
題意是給你n個點,然後要求以每個點為圓心畫乙個圓,使得兩兩相鄰的圓心的圓相切,不相鄰的圓可以相交,如果可以作這樣的圓那麼輸出圓面積和的最小值和,每個圓的半徑,否則輸出impossible。首先我們求出每一條鄰邊的長度,記為l1,l2,l3,ln,假定第乙個圓的半徑為x,那麼我們可以用x表示所有圓的半...