HDU 5531 Rebuild
2015 ACM/ICPC 长春现场赛 E题
三分。
如果节点个数是奇数,那么直接列方程可以求解,因为,如果第一个圆半径变大,必然导致最后一个圆的半径变大,
所以,节点是奇数的时候,要么无解,要么只有一组解。
如果节点个数是偶数,如果奇数编号起点的线段长度之和不等于偶数编号起点的线段长度之和,那么必定无解,这个列方程也可以发现的。
剩下的就要三分求最优解了,边界的确定有点小坑,第一个半径是X,第二个半径就是 L12-X,第三个半径就是L23-L12+X.....写出n个关于X的表达式,可以确定三分范围。
至此,此题已解。
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std; const double PI=acos(-1.0);
const double eps=1e-; struct Point
{
double x,y;
double r;
}P[+];
struct Line
{
double len;
}L[+];
int T,n;
double r[+]; bool Equal(double a,double b)
{
if(fabs(a-b)<eps) return ;
return ;
} double Dis(int a,int b)
{
return sqrt((P[a].x-P[b].x)*(P[a].x-P[b].x)+(P[a].y-P[b].y)*(P[a].y-P[b].y));
} void read()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%lf%lf",&P[i].x,&P[i].y);
for(int i=;i<=n;i++)
{
if(i<n) L[i].len=Dis(i,i+);
else L[i].len=Dis(n,);
}
} void print1()
{
double sum=;
for(int i=;i<=n;i++)
if(P[i].r<)
{
printf("IMPOSSIBLE\n");
return ;
}
for(int i=;i<=n;i++)
sum=sum+P[i].r*P[i].r;
printf("%.2lf\n",sum*PI);
for(int i=;i<=n;i++)
printf("%.2lf\n",P[i].r);
} double ff(double R)
{
r[]=R;
for(int i=;i<=n;i++)
r[i]=L[i-].len-r[i-]; double sum=;
for(int i=;i<=n;i++) sum=sum+r[i]*r[i];
return sum;
} void solve()
{
if(n%==)
{
double len1=,len2=;
for(int i=;i<=n;i++)
{
if(i%==) len2=len2+L[i].len;
else len1=len1+L[i].len;
}
P[].r=(len1-len2)/2.0;
for(int i=;i<=n;i++)
P[i].r=L[i-].len-P[i-].r; if(!Equal(L[n].len-P[].r,P[n].r))
{
printf("IMPOSSIBLE\n");
return;
}
print1();
} else if(n%==)
{
double len1=,len2=;
for(int i=;i<=n;i++)
{
if(i%==) len1=len1+L[i].len;
else len2=len2+L[i].len;
}
if(len1!=len2) printf("IMPOSSIBLE\n");
else
{
double left,right,mid,midmid;
left=; right=min(L[].len,L[n].len);
double sum=;
for(int i=;i<=n;i++)
{
if(i%==)
{
sum=sum+L[i].len;
if(sum<right) right=sum;
}
else
{
sum=sum-L[i].len;
if(sum>left) left=sum;
}
}
int tot=;
while(tot--)
{
mid=(left+right)/2.0;
midmid=(mid+right)/2.0;
double k1=ff(mid);
double k2=ff(midmid); if(k1-k2>eps) left=mid;
else right=midmid; }
for(int i=;i<=n;i++)
if(r[i]<)
{
printf("IMPOSSIBLE\n");
return ;
}
printf("%.2lf\n",ff(midmid)*PI);
for(int i=;i<=n;i++) printf("%.2lf\n",r[i]);
}
}
} int main()
{
scanf("%d",&T);
while(T--)
{
read();
solve();
}
return ;
}
HDU 5531 Rebuild的更多相关文章
- HDU 5531 Rebuild (2015长春现场赛,计算几何+三分法)
Rebuild Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total S ...
- 2015ACM/ICPC亚洲区长春站 E hdu 5531 Rebuild
Rebuild Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total S ...
- 2015长春 HDU 5531 Rebuild
题意:n个顶点组成的多边形能否形成正多边形? #include <cstdio> #include <cstring> #include <cmath> #incl ...
- [三分]HDOJ 5531 Rebuild
题意:给n个点,以这n个点为圆心画圆,使得所有的圆与其相邻的圆相切. 求n个圆最小的面积和. 分析:很容易想到确定了其中一个圆的半径之后,其他的圆的半径也能随之确定了. 画一画三个点的和四个点的,会发 ...
- HDU 5531
题目大意: 给定一个n边形的顶点 以每个顶点为圆心画圆(半径可为0) 每个顶点的圆要和它相邻顶点的圆相切(不相邻的可相交) 求所有圆的最小面积总和并给出所有圆的半径 设半径为r1 r2 ... rn, ...
- HDU 3080 The plan of city rebuild(prim和kruskal)
The plan of city rebuild Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java ...
- HDU 3080 The plan of city rebuild(除点最小生成树)
题意 一个城市原来有l个村庄 e1条道路 又添加了n个村庄 e2条道路 后来后销毁了m个村庄 与m相连的道路也销毁了 求使全部未销毁村庄相互连通最小花费 不能连通输出what a pity ...
- E - Rebuild UVALive - 7187 (二次函数极值问题)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5531 Problem Description Archaeologists find ruins of ...
- HDU 5723 Abandoned country(落后渣国)
HDU 5723 Abandoned country(落后渣国) Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 65536/65536 ...
随机推荐
- 解析好的静态页面.shtml浏览器无法解析.需要apache解析后再返回给浏览器
解析好的静态页面.shtml浏览器无法解析.需要apache解析后再返回给浏览器 让Apache支持SHTML(SSI)的配置方法 http.conf放开addtype text/html .shtm ...
- 【伪一周小结(没错我一周就做了这么点微小的工作)】HDOJ-1241 Oil Deposits 初次AC粗糙版对比代码框架重构版
2016 11月最后一周 这一周复习了一下目前大概了解的唯一算法--深度优先搜索算法(DFS).关于各种细节的处理还是极为不熟练,根据题意判断是否还原标记也无法轻松得出结论.不得不说,距离一个准ACM ...
- Server对象(是属性)
html, body { font-size: 10.5pt; } body { font-family: 微软雅黑, Helvetica, "Hiragino Sans GB", ...
- .Net日期处理之格式化
一.默认格式 2015/9/3 9:04:31 二.格式2 2015年9月3日 9:28:51 三.格式3 2015年9月3日 9:31 四.格式4 2015/9/3 9:39:01 五.格式5 20 ...
- 关于Ajax的type为post提交方式出现请求失效问题
最近碰到这样一个问题,原本一个ajax异步提交数据之前是很好的,很多系统都延用了均未出现任何问题.最近这个版本却出现ajax方式post数据不到后台程序,让我折腾了好几天.起初的ajax是这样写的: ...
- OpenGL----绘制立方体,定点数组与顶点缓冲
,立方体是很简单,但是这里只是拿立方体做一个例子,来说明OpenGL在绘制方法上的改进.从原始一点的办法开始一个立方体有六个面,每个面是一个正方形,好,绘制六个正方形就可以了. glBegin(GL_ ...
- Spring Boot 系列教程16-数据国际化
internationalization(i18n) 国际化(internationalization)是设计和制造容易适应不同区域要求的产品的一种方式. 它要求从产品中抽离所有地域语言,国家/地区和 ...
- LightOJ 1259 Goldbach`s Conjecture 素数打表
题目大意:求讲一个整数n分解为两个素数的方案数. 题目思路:素数打表,后遍历 1-n/2,寻找方案数,需要注意的是:C/C++中 bool类型占用一个字节,int类型占用4个字节,在素数打表中采用bo ...
- Tinyxml封装类COperatorXml
OperatorXml.h头文件 #ifndef _OPERATOR_XML_H_ #define _OPERATOR_XML_H_ #include <string> class TiX ...
- git 强制覆盖本地文件
git fetch --all git reset --hard origin/master git pull