http://172.20.6.3/Problem_Show.asp?id=1502
这种题用了快一天才写出来也是真的辣鸡。主要思路就是计算一下被挡住的弧度然后对弧度进行贪心。
最开始比较困扰的是求弧度值及其起始位置的部分,弧度值很好求,位置有点恶心,我的起始位置设置的是圆的十二点方向顺时针到起始位置的弧度值,然后我分了四种情况讨论(因为遮挡的方向有两种不同情况,遮挡部分弧度值与180度的关系又是两种情况),应该是有更简单的方法的,但是我只能想出来这种了。。。

代码

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<algorithm>
  4. #include<cmath>
  5. #include<iostream>
  6. using namespace std;
  7. const int maxn=;
  8. const double eps=0.0000001;
  9. long long n;
  10. double r[maxn]={},x[maxn]={},y[maxn]={};
  11. struct nod{
  12. double id,v;
  13. }e[maxn];
  14. int tot;
  15. bool mmp(nod aa,nod bb){
  16. return aa.id<bb.id;
  17. }
  18. double getit(int i){
  19. tot=;double cnt=;
  20. for(int j=n;j>i;j--){
  21. double w=sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));
  22. if(r[i]+r[j]-w<=||r[i]-r[j]-w>=)continue;
  23. if(r[j]-r[i]-w>=) return ;
  24.  
  25. double z=(r[i]*r[i]-r[j]*r[j]+w*w)/(*w);
  26. double h=acos(z/r[i])*;
  27.  
  28. double xx=x[i]+(x[j]-x[i])/w*z,yy=y[i]+(y[j]-y[i])/w*z;
  29. double w1=sqrt((x[i]-xx)*(x[i]-xx)+(y[i]+z-yy)*(y[i]+z-yy));
  30. double h2=asin(w1//z)*;
  31. if(xx<x[i]){
  32. if(h2<)h2=-h2;
  33. else if(h2>) h2=*M_PI-h2; }
  34. else if (xx>x[i]){if(h2<) h2=*M_PI+h2;}
  35. h2=h2-h/;
  36. if(h2<)h2+=*M_PI;
  37. h=h2+h;
  38. if(h>*M_PI){
  39. e[++tot].id=h2;e[tot].v=*M_PI;
  40. e[++tot].id=;e[tot].v=h-*M_PI;
  41. }else{e[++tot].id=h2;e[tot].v=h;}
  42. }
  43. sort(e+,e++tot,mmp);
  44. double ll=0.0,rr=0.0;
  45. for(int j=;j<=tot;j++){
  46. if(e[j].id-rr<){
  47. if(e[j].v-rr>){
  48. rr=e[j].v;
  49. }
  50. }
  51. else if(e[j].v-rr>){
  52. cnt+=rr-ll;
  53. rr=e[j].v;ll=e[j].id;
  54. }
  55. }
  56. cnt+=rr-ll;
  57. return r[i]*(M_PI*-cnt);
  58. }
  59. int main(){
  60. //freopen("wtf.in","r",stdin);
  61. scanf("%d",&n);
  62. for(int i=;i<=n;i++){
  63. scanf("%lf%lf%lf",&r[i],&x[i],&y[i]);
  64. }double ans=;
  65. for(int i=n;i>=;i--){
  66. ans+=getit(i);
  67. }printf("%.3f\n",ans);
  68. return ;
  69. }

JZYZOJ1502 [haoi2008]下落的圆盘 计算几何 贪心的更多相关文章

  1. bzoj1043[HAOI2008]下落的圆盘 计算几何

    1043: [HAOI2008]下落的圆盘 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1598  Solved: 676[Submit][Stat ...

  2. 【bzoj1043】[HAOI2008]下落的圆盘 计算几何

    题目描述 有n个圆盘从天而降,后面落下的可以盖住前面的.求最后形成的封闭区域的周长.看下面这副图, 所有的红色线条的总长度即为所求. 输入 第一行为1个整数n,N<=1000接下来n行每行3个实 ...

  3. BZOJ 1043 HAOI2008 下落的圆盘 计算几何

    题目大意:n个圆盘依次下落.求终于能看到的轮廓线面积 円盘反对! 让我们一起团结起来! 赶走円盘! 咳咳.非常神的一道题 今天去看了题解和白书才搞出来-- 首先我们倒着做 对于每一个圆盘处理出在它之后 ...

  4. BZOJ 1043 [HAOI2008]下落的圆盘 ——计算几何

    倒着考虑,加入一个圆,判断和前面有没有完全覆盖的情况. 如果没有,和圆盘一一取交集,然后计算它们的并集,然后计算即可. #include <map> #include <cmath& ...

  5. 【BZOJ1043】[HAOI2008]下落的圆盘 几何

    [BZOJ1043][HAOI2008]下落的圆盘 Description 有n个圆盘从天而降,后面落下的可以盖住前面的.求最后形成的封闭区域的周长.看下面这副图, 所有的红色线条的总长度即为所求.  ...

  6. luogu P2510 [HAOI2008]下落的圆盘

    LINK:下落的圆盘 计算几何.n个圆在平面上编号大的圆将编号小的圆覆盖求最后所有没有被覆盖的圆的边缘的总长度. 在做这道题之前有几个前置知识. 极坐标系:在平面内 由极点 极轴 和 极径组成的坐标系 ...

  7. 【BZOJ1043】下落的圆盘 [计算几何]

    下落的圆盘 Time Limit: 10 Sec  Memory Limit: 162 MB[Submit][Status][Discuss] Description 有n个圆盘从天而降,后面落下的可 ...

  8. 【BZOJ】1043: [HAOI2008]下落的圆盘(计算几何基础+贪心)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1043 唯一让我不会的就是怎么求圆的周长并QAAQ... 然后发现好神!我们可以将圆弧变成$[0, 2 ...

  9. 【计算几何】bzoj1043 [HAOI2008]下落的圆盘

    n^2枚举圆盘,用两圆圆心的向量的极角+余弦定理求某个圆覆盖了该圆的哪一段区间(用弧度表示),最后求个区间并. 注意--精度--最好再累计区间的时候,把每个区间的长度减去EPS,防止最后覆盖的总区间超 ...

随机推荐

  1. 【BZOJ】1202: [HNOI2005]狡猾的商人

    [题意]w组数据,给定n和m,给出m段区间[s,t](1<=s<=t<=n)的数字和,求是否矛盾.n<100,m<1000,w<100. [算法]带权并查集 [题解 ...

  2. 【洛谷 P2742】【模板】二维凸包

    题目链接 二维凸包板子..有时间会补总结的. #include <cstdio> #include <cmath> #include <algorithm> usi ...

  3. Super A^B mod C (快速幂+欧拉函数+欧拉定理)

    题目链接:http://acm.fzu.edu.cn/problem.php?pid=1759 题目:Problem Description Given A,B,C, You should quick ...

  4. MSSQL DBcheck

    --1.创建数据库. --create database MyDatabase; --删除数据库 --drop database MyDatabase; ----------------------- ...

  5. 【HNOI】 攻城略池 tree-dp

    [题目大意] 给定一棵树,边有边权,每个节点有一些兵,现在叶子节点在0时刻被占领,并且任意节点在x被占领,那么从x+1开始,每单位时间产生一个兵,兵会顺着父亲节点一直走到根(1),其中每经过一个节点, ...

  6. Gulp、Grunt构建工具

    在Gulp中创建一个库从磁盘gulp.src读取源文件并通过磁盘管道写回内容到gulp.dest,可以理解成只是将文件复制到另一个目录. var gulp = require('gulp'); gul ...

  7. exit() _exit() 函数区别

    exit(): --stdlib.h (1) 所有使用atexit()注册的函数,将会被以注册相反的顺序调用: (2) 所有打开的输出流被刷新,并且关闭流: (3) 使用tmpfile()创建的文件将 ...

  8. ogre3d环境配置 SDK安装配置及简单事例教程

    ogre3d环境配置 SDK安装配置及简单事例教程 http://www.cr173.com/html/22594_1.html ogre3d环境配置 SDK安装配置及简单事例教程 http://ww ...

  9. 大公司开源网址[www]

    https://github.com/blackberry https://github.com/CallForSanity?tab=repositories https://github.com/b ...

  10. MHA切换过程:

    1.监测master的状态Ping(SELECT) succeeded, waiting until MySQL doesn't respond.. 2.当监控发现master异常时发出warning ...