HDU 5531(Rebuild )分析 三分

2021-08-30 11:22:23 字數 1766 閱讀 8721

給定乙個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表示所有圓的半...