比赛时没做出来,最后10 钟时倒是想枚举每个角度,精度估计上可能会出问题;

后来听“理宝”说可以暴力枚举边的长度,精确到0.001,数据恰好10^7,T_T~~

vongang说可以用二分做,也就是官方解题报告的解法:

这题用二分的关键是:

首先Regular Polygon是正多边形,:

        想到边长和所对的角成正比,没想到啊,Orz,各路大神

贴个山寨的代码吧:

#include<stdio.h>#include<math.h>

#define N 110const double  inf =10000;const double pi=acos(-1.0);const double eps =1e-6;double  len[N];

bool dd(double x,double y) {return fabs(x-y)<eps;}bool xy(double x,double y) {return x < y - eps;}bool yx(double x,double y) {return x > y + eps;}bool xyd(double x,double y) {return x < y + eps;}bool yxd(double x,double y) {return x > y - eps;}

double ang_cal(double a,double b,double c){return acos((a*a+b*b-c*c)/(2*a*b));}int solve(int n,double x){double ang=0;for(int i=0;i<n;i++)    {if(yxd(x,len[i]+len[i+1])) return 1;if(xyd(x,fabs(len[i]-len[i+1]))) return -1;        ang+=ang_cal(len[i],len[i+1],x);    }if(dd(ang,2*pi)) return 0;if(xy(ang,2*pi)) return -1;if(yx(ang,2*pi)) return 1;}bool check(double ang,double x){double a1=ang_cal(len[1],x,len[0]);double a2=ang_cal(len[1],x,len[2]);return dd(ang,a1+a2);}

int main(){int cs=1,ncs,n;    scanf("%d",&ncs);while(ncs--)    {     scanf("%d",&n);for(int i=0;i<n;i++) scanf("%lf",len+i);     len[n]=len[0];

double bg=0,end=inf,mid;int flag=0,cnt=0;while( xyd(bg,end) )     {if(dd(bg,end)) cnt++;if(cnt==2) break;

         mid=(bg+end)/2;int ans=solve(n,mid);if(ans==0)         {             flag=1;break;         }if(ans > 0) end=mid;else bg=mid;     }if(flag)     {double ang=(n-2)*pi/n;if(!check(ang,mid))           printf("Case %d: impossible\n",cs++);

else          printf("Case %d: %.3f\n",cs++,mid);     }else printf("Case %d: impossible\n",cs++);    }return 0;}

转载于:https://www.cnblogs.com/skyming/archive/2012/04/05/2433683.html

HDU 4033 Regular Polygon(二分+高精度)相关推荐

  1. 求正多边形的面积JAVA_第六章第三十六题(几何:正多边形的面积)(Geometry: area of a regular polygon)...

    *6.36(几何:正多边形的面积)正多边形是一个n条边的多边形,它的每条边的长度都相等,而且所有角的角度也相等(即多边形既是等边又等角的).计算正多边形面积的公式是: 使用下面的方法头编写方法,返回正 ...

  2. hdu6055—Regular polygon(正方形的判定)

    题目链接:传送门 Regular polygon Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java ...

  3. hdu 4033 二分几何

    参考:http://blog.csdn.net/libin56842/article/details/26618129 题意:给一个正多边形内点到其他顶点的距离(逆时针给出),求正多边形的边长 二分多 ...

  4. HDU 3646 DP + 二分

    链接:http://acm.hdu.edu.cn/showproblem.php?pid=3646 题意:你有N把武器,每把武器可以对敌人造成一定的伤害(et:攻击力500,敌人血量为200,杀死敌人 ...

  5. hdu 5199 map或二分或哈希

    题目描述:给出n棵树的高度,每棵树上都站着一只鸟,枪手Jack站在最左边那棵树的左边对鸟进行射击,当Jack在高度为H的地方向右发射一颗子弹的时候,高度为H的树上的鸟儿就会掉落(注:其他树上的鸟儿不会 ...

  6. HDU 5972 Regular Number

    Regular Number http://acm.hdu.edu.cn/showproblem.php?pid=5972 题意: 给定一个字符串,求多少子串满足,子串的第i位,只能是给定的数(小于等 ...

  7. HDU 2289 Cup(二分+圆台体积)

    Problem Description The WHU ACM Team has a big cup, with which every member drinks water. Now, we kn ...

  8. HDU 5972 Regular Number(ShiftAnd+读入优化)

    [题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=5972 [题目大意] 给出一个字符串,找出其中所有的符合特定模式的子串位置,符合特定模式是指,该子串 ...

  9. HDU 1047 Integer Inquiry( 高精度加法水 )

    链接:传送门 思路:高精度水题 /*************************************************************************> File ...

最新文章

  1. Laravel和Thinkphp有什么区别,哪个框架好用
  2. Ecology Letters:重金属的污染可导致铁载体生产菌的增加
  3. 《预训练周刊》第19期:歧义短语的类量子语境性研究、自然语言处理中prompt方法的系统综述...
  4. linux大容量硬盘 克隆到小硬盘_Linux添加新硬盘的挂载方法
  5. 9个让2D游戏创作更轻松的工具
  6. java删除字符串最后一位
  7. C#开发模式——单例模式
  8. 方便的Chrome取色插件ColorPick Eyedropper [设计, FE必备]
  9. C ~ 指针函数与函数指针的区别
  10. clobzh字符串缓冲区太小的解决方法_用4K屏玩LOL英雄联盟游戏指针太小解决方法已找到...
  11. 读EasyPR开发详解实践感想1
  12. django urls路由匹配分发
  13. 搭建Windows下基于Eclipse 的 PHP 开发环境
  14. 包含min函数的栈 【微软面试100题 第二题】
  15. java hql left join_求教hql的left join结合条件的写法
  16. 腾讯会议共享屏幕时,设置演讲者模式仅自己可见
  17. 如何下载免费版的PDF编辑器
  18. linux玩安卓游戏下载,在Deepin 20.2系统下可用Xdroid on Linux来玩王者荣耀游戏
  19. nodejs 定时任务
  20. C++超市管理系统(MySQL)

热门文章

  1. RUNNOOB python练习题 28 递归 数列
  2. Linux 指定运行时动态库路径【转】
  3. IDEA去除mapper.xml文件中的sql语句的背景色
  4. 【Spark】SparkStreaming-Kafka-Redis-集成-基础参考资料
  5. 系统滚动条实现的NUD控件Unusable版
  6. orapwd创建密码文件
  7. 南下事业篇——深圳 深圳(回顾)
  8. IBM副总裁自述的数据中心简化经验
  9. Mybatis—多表查询
  10. leetcode 842. 将数组拆分成斐波那契序列(回溯算法)