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 ...
随机推荐
- 常用的css
产品鼠标经过加边框效果 .productsCol:hover { box-shadow: 0 0 0 3px #333333 inset; transition: all 0.2s ease 0s; ...
- H5的新应用-获取用户当前的地理坐标
------------------------------ <script type="text/javascript"> ...
- JavaScript在智能手机上的应用-通过滑动修改网页字体大小
---------------------------------- <script type="text/javascript"> //变量x, ...
- CCF考试真题题解
CCF考试认证:题解参考博客http://blog.csdn.net/u014578266/article/details/45221841 问题描述 试题编号: - 试题名称: 图像旋转 时间限制: ...
- 在Windows上安装Python
首先,从官网下载 最新版本 的Python 2.7.可通过 Python官网 的”Windows Installer”链接保证下载到的版本是最新的. Windows版本是MSI文件格式,双击它即可开始 ...
- 解决网站出现GET .woff 404 (Not Found)的问题
网站发布到IIS后,发现网站使用的Bootstrap框架所引用的woff字体无法正常显示. 于是跟踪http请求,对woff字体请求出现GET .woff 404 (Not Found)的问题,但是项 ...
- (转载)解析ISO8583报文实例
本篇文章参考了中国银联POS终端规范,所以如有不明白的可以去我的资源里面下载. 现在我们有ISO8583报文如下(十六进制表示法): 60 00 03 00 00(前五个字节为TPDU) 60 31 ...
- git 提高下载速度
1. 直接下载分支,就不用下载不需要的源码了. git clone --depth 1 git://github.com/TI-OpenLink/wl18xx.git --branch ol_r8 ...
- CentOS6.6 部署Apache+Svn
svn代码 目前大多数公司 管理代码都是用这个 这个比较方便简单,git用的人数也比较多,我们下面来部署一下这个程序 svn+apache集成 系统环境 # cat /etc/redhat-relea ...
- SQLServer在多个表中都增加一个字段的方法
1.使用游标 declare @sql varchar(), @name varchar() declare my_cursor scroll cursor for select name from ...