E - Rebuild UVALive - 7187 (二次函数极值问题)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5531
The ruins form a closed path on an x-y plane, which has n endpoints. The endpoints locate on (x1,y1), (x2,y2), …,(xn,yn) respectively. Endpoint i and endpoint i−1 are adjacent for 1<i≤n, also endpoint 1 and endpoint n are adjacent. Distances between any two adjacent endpoints are positive integers.
To rebuild, they need to build one cylindrical pillar at each endpoint, the radius of the pillar of endpoint i is ri. All the pillars perpendicular to the x-y plane, and the corresponding endpoint is on the centerline of it. We call two pillars are adjacent if and only if two corresponding endpoints are adjacent. For any two adjacent pillars, one must be tangent externally to another, otherwise it will violate the aesthetics of Ancient ACM Civilization. If two pillars are not adjacent, then there are no constraints, even if they overlap each other.
Note that ri must not be less than 0 since we cannot build a pillar with negative radius and pillars with zero radius are acceptable since those kind of pillars still exist in their neighbors.
You are given the coordinates of n endpoints. Your task is to find r1,r2,…,rn which makes sum of base area of all pillars as minimum as possible.
For example, if the endpoints are at (0,0), (11,0), (27,12), (5,12), we can choose (r1, r2, r3, r4)=(3.75, 7.25, 12.75, 9.25). The sum of base area equals to 3.752π+7.252π+12.752π+9.252π=988.816…. Note that we count the area of the overlapping parts multiple times.
If there are several possible to produce the minimum sum of base area, you may output any of them.
The first line of each case contains one positive integer n, the size of the closed path. Next n lines, each line consists of two integers (xi,yi) indicate the coordinate of the i-th endpoint.
1≤t≤100
3≤n≤104
|xi|,|yi|≤104
Distances between any two adjacent endpoints are positive integers.
If there are several possible ways to produce the minimum sum of base area, you may output any of them.
4
0 0
11 0
27 12
5 12
5
0 0
7 0
7 3
3 6
0 6
5
0 0
1 0
6 12
3 16
0 12
3.75
7.25
12.75
9.25
157.08
6.00
1.00
2.00
3.00
0.00
IMPOSSIBLE
- #include <bits/stdc++.h>
- #define met(a, b) memset(a, b, sizeof(a))
- #define ll long long
- #define ull unsigned long long
- #define rep(i,a,b) for(int i=a;i<=b;i++)
- using namespace std;
- typedef pair<int,int>P;
- const int maxn=;
- const double eps=1e-;
- const double pi=acos(-);
- P p[maxn];
- double d[maxn],f[maxn];
- double dist(P a,P b)
- {
- return sqrt((a.first-b.first)*(a.first-b.first)+(a.second-b.second)*(a.second-b.second));
- }
- int main()
- {
- int T;
- cin>>T;
- while(T--){
- int n;
- cin>>n;
- for(int i=;i<=n;i++)cin>>p[i].first>>p[i].second;
- for(int i=;i<=n;i++){
- if(i==n)d[i]=dist(p[i],p[]);
- else d[i]=dist(p[i],p[i+]);
- }
- double maxx=0x3f3f3f3f,minn=;//极值上下限
- f[]=;
- for(int i = ; i <=n ; i++)
- {
- f[i] = d[i-] - f[i-];
- if(i%== && f[i] < maxx)//若为偶数点,则该圆的半径只能减小这么多(即第一个圆的半径只能增大这么多),更新最大值下限
- {
- maxx = f[i];
- }
- if(i%== && (-f[i]) > minn)//若为奇数点,且此时f[i]小与0,则必须第一个圆的半径更新为该值,更新最小值上限
- {
- minn = -f[i];
- }
- }
- if(minn >= maxx + eps )//无解
- {
- printf("IMPOSSIBLE\n");
- continue;
- }
- if(n%==){//奇数个点,有解则必有唯一解,否则无解
- double x=;//第一个圆的半径x=(d1-d2+d3-d4...)/2,唯一解.
- for(int i=;i<=n;i++){
- if(i%==)x+=d[i];
- else x-=d[i];
- }
- x/=;
- if(x<=minn-eps||x>=maxx+eps){
- cout<<"IMPOSSIBLE"<<endl;
- continue;
- }
- double area=;
- for(int i=;i<=n;i++){
- if(i%==)area+=(f[i]+x)*(f[i]+x);
- else area+=(f[i]-x)*(f[i]-x);
- }
- area*=pi;
- printf("%.2f\n",area);
- for(int i=;i<=n;i++){
- if(i%==)printf("%.2f\n",f[i]+x);
- else printf("%.2f\n",f[i]-x);
- }
- }
- else{//偶数情况构造二次函数,y=a*x*x+b*x+c
- double now=;
- for(int i=;i<=n;i++){
- if(i%==)now+=d[i];
- else now-=d[i];
- }
- if(fabs(now)>eps||minn-maxx>eps){
- cout<<"IMPOSSIBLE"<<endl;
- continue;
- }
- double a=n;
- double b=,c=;
- for(int i=;i<=n;i++){
- if(i%==){
- b+=*f[i];
- }
- else{
- b-=*f[i];
- }
- c+=f[i]*f[i];
- }
- double x=-b/(*a);
- if(x<minn+eps)x=minn;
- if(x>maxx-eps)x=maxx;
- double area=a*x*x+b*x+c;
- area*=pi;
- printf("%.2f\n",area);
- for(int i=;i<=n;i++){
- if(i%==)printf("%.2f\n",f[i]+x);
- else printf("%.2f\n",f[i]-x);
- }
- }
- }
- return ;
- }
E - Rebuild UVALive - 7187 (二次函数极值问题)的更多相关文章
- (转载)SVM-基础(五)
作为支持向量机系列的基本篇的最后一篇文章,我在这里打算简单地介绍一下用于优化 dual 问题的 Sequential Minimal Optimization (SMO) 方法.确确实实只是简单介绍一 ...
- SVM个人学习总结
SVM个人学习总结 如题,本文是对SVM学习总结,主要目的是梳理SVM推导过程,以及记录一些个人理解. 1.主要参考资料 [1]Corres C. Support vector networks[J] ...
- 2015ACM/ICPC亚洲区长春站 E hdu 5531 Rebuild
Rebuild Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total S ...
- HDU 5531 Rebuild (2015长春现场赛,计算几何+三分法)
Rebuild Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 262144/262144 K (Java/Others)Total S ...
- Visual Studio 中 Build 和 Rebuild 的区别
因为之前写的程序比较小,编译起来比较快,所以一直都没有太在意 Build 和 Rebuild 之间的区别,后来发现两个还是有很大不同. Build 只针对在上次编译之后更改过的文件进行编译,在项目比较 ...
- 解决 node-gyp rebuild 卡住 的问题
node-gyp在编译前会首先尝试下载node的headers文件,像这样: gyp http GET https://nodejs.org/download/release/v6.8.1/node- ...
- AndroidStudio中make Project、clean Project、Rebuild Project的区别
1.Make Project:编译Project下所有Module,一般是自上次编译后Project下有更新的文件,不生成apk. 2.Make Selected Modules:编译指定的Modul ...
- Rebuild Instance 操作详解 - 每天5分钟玩转 OpenStack(37)
上一节我们讨论了 snapshot,snapshot 的一个重要作用是对 instance 做备份. 如果 instance 损坏了,可以通过 snapshot 恢复,这个恢复的操作就是 Rebuil ...
- UVALive - 4108 SKYLINE[线段树]
UVALive - 4108 SKYLINE Time Limit: 3000MS 64bit IO Format: %lld & %llu Submit Status uDebug ...
随机推荐
- k8s CI/CD--Jenkinsfile例子
试用k8s内部jenkins,并且配置好podtemplate pipeline{ agent any stages{ stage('get the code'){ steps{ ...
- 量化投资_Multicharts数组操作函数_append()追加函数(自定义)
1. Multicharts中关于数组的操作比较麻烦,而且当中所谓的动态数组的定义并不是像其他语言那种的概念.因此要对数组进行元素“”追加“”的话,需要重新更改数组的索引,然后再最后一个位置添加val ...
- CSS 弹性盒子 flex的三个属性:grow、shrink、basis
flex-grow 首先介绍flex-grow属性,flex-grow会在容器太大时(图片A.B的宽度和 < 父容器宽度)对元素作出调整. 如果图片A的flex-grow属性的值为 1,图片B的 ...
- 【新年呈献】高性能网络通信框架 HP-Socket v5.7.1
项目主页 : http://www.oschina.net/p/hp-socket 开发文档 : https://www.docin.com/p-2287339564.html 下载地址 : http ...
- HZNU-ACM寒假集训Day10小结 树-树形DP
树形DP 加分二叉树 洛谷P1040 注意中序遍历的特点:当根节点编号k时,编号小于k的都在其左子树上,编号大于k的都在右子树 转移方程 f[i,j]=max{f[i,k-1]*f[k+1,j]+d[ ...
- C#高级编程(第9版) 第06章 数组
好久没发东西了 , 一停下来就会变懒.... 虽然没完成,也就是它吧 --------------------------------- 以下正文 -------------------------- ...
- 数据可视化BI平台——CBoard的部署与使用(笔记整理)
CBoard作为国内自主开发的数据可视化平台,因其方便好用而受到广大用户的使用和好评.现今CBoard有社区版和企业版两个版本,本文所述为社区版的0.4.2版本.注意:所需的一切资源以及相关参考链接都 ...
- CDH6.2安装配置第二篇:CDH安装的前期配置
本篇介绍cdh安装之前需要的一些必要配置,当然这些配置也可以用shell脚本来配置.在安装之前请先配置好yum源,在文中用的统一都是阿里源.在安装的时候,要确保主机的内存是4G以上,要不然会无限重启c ...
- java课程之团队开发冲刺阶段1.10
一.总结昨天任务: 1.已完成系统规划总结 二.遇到的问题: 1,整合的过程中并没有的很好的处理其中的关系,应当将常用的方法总结成一个工具类便于使用.这样在二次使用的时候会便捷不少. 三.今天的任务 ...
- ES6 之 Math对象的扩展
1.ES5 http://www.w3school.com.cn/jsref/jsref_obj_math.asp 2.ES6 Math.trunc() - 取整,去掉一个数的小数部分 console ...