2829: 信用卡凸包

Time Limit: 10 Sec  Memory Limit: 128 MB
Submit: 1342  Solved: 577
[Submit][Status][Discuss]


Description



Input



Output



Sample Input


2
6.0 2.0 0.0
0.0 0.0 0.0
2.0 -2.0 1.5707963268


Sample Output


3.333


HINT


本样例中的2张信用卡的轮廓在上图中用实线标出,如果视1.5707963268为Pi/2(pi为圆周率),则其凸包的周长为16+4*sqrt(2)

【思路】

凸包

将一张信用卡看作以四个圆心为顶点的矩形,求出凸包周长后再加一个圆周长。

【代码】

  1. #include<cmath>
  2. #include<cstdio>
  3. #include<vector>
  4. #include<cstring>
  5. #include<algorithm>
  6. #define FOR(a,b,c) for(int a=(b);a<=(c);a++)
  7. using namespace std;
  8.  
  9. const int N = +;
  10. const double PI = acos(-1.0);
  11. const double eps = 1e-;
  12.  
  13. int dcmp(double x) {
  14. if(fabs(x)<eps) return ; else return x<? -:;
  15. }
  16.  
  17. struct Pt {
  18. double x,y;
  19. Pt(double x=,double y=) :x(x),y(y) {};
  20. };
  21. typedef Pt vec;
  22.  
  23. vec operator - (Pt a,Pt b) { return vec(a.x-b.x,a.y-b.y); }
  24. vec operator + (vec a,vec b) { return vec(a.x+b.x,a.y+b.y); }
  25. bool operator == (Pt a,Pt b) {
  26. return dcmp(a.x-b.x)== && dcmp(a.y-b.y)==;
  27. }
  28. bool operator < (const Pt& a,const Pt& b) {
  29. return a.x<b.x || (a.x==b.x && a.y<b.y);
  30. }
  31.  
  32. vec rotate(vec a,double x) {
  33. return vec(a.x*cos(x)-a.y*sin(x),a.x*sin(x)+a.y*cos(x));
  34. }
  35. double cross(vec a,vec b) { return a.x*b.y-a.y*b.x; }
  36. double dist(Pt a,Pt b) {
  37. return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
  38. }
  39.  
  40. vector<Pt> ConvexHull(vector<Pt> p) {
  41. sort(p.begin(),p.end());
  42. p.erase(unique(p.begin(),p.end()),p.end());
  43. int n=p.size() , m=;
  44. vector<Pt> ch(n+);
  45. for(int i=;i<n;i++) {
  46. while(m> && cross(ch[m-]-ch[m-],p[i]-ch[m-])<=) m--;
  47. ch[m++]=p[i];
  48. }
  49. int k=m;
  50. for(int i=n-;i>=;i--) {
  51. while(m>k && cross(ch[m-]-ch[m-],p[i]-ch[m-])<=) m--;
  52. ch[m++]=p[i];
  53. }
  54. if(n>) m--;
  55. ch.resize(m); return ch;
  56. }
  57.  
  58. int n;
  59. double a,b,r;
  60. vector <Pt> p,ch;
  61.  
  62. int main() {
  63. scanf("%d%lf%lf%lf",&n,&b,&a,&r);
  64. a-=*r , b-=*r; a/= , b/=;
  65. double x,y,ang,ans=;
  66. FOR(i,,n) {
  67. scanf("%lf%lf%lf",&x,&y,&ang);
  68. Pt o=Pt(x,y);
  69. p.push_back(o+rotate(vec(-a,-b),ang));
  70. p.push_back(o+rotate(vec(-a,b),ang));
  71. p.push_back(o+rotate(vec(a,-b),ang));
  72. p.push_back(o+rotate(vec(a,b),ang));
  73. }
  74. ch=ConvexHull(p);
  75. n=ch.size();
  76. FOR(i,,n-)
  77. ans+=dist(ch[i],ch[i+]);
  78. ans+=dist(ch[n-],ch[]);
  79. ans+=*PI*r;
  80. printf("%.2lf",ans);
  81. return ;
  82. }

bzoj 2829 信用卡凸包(凸包)的更多相关文章

  1. BZOJ 2829 信用卡凸包 ——计算几何

    凸包裸题 #include <map> #include <cmath> #include <queue> #include <cstdio> #inc ...

  2. 【BZOJ 2829】 2829: 信用卡凸包 (凸包)

    2829: 信用卡凸包 Description Input Output Sample Input 2 6.0 2.0 0.0 0.0 0.0 0.0 2.0 -2.0 1.5707963268 Sa ...

  3. BZOJ 2829 凸包

    思路: 把信用卡周围去掉  只剩下中间的长方形 最后的答案加上一个圆 //By SiriusRen #include <bits/stdc++.h> using namespace std ...

  4. BZOJ2829信用卡凸包——凸包

    题目描述 输入 输出 样例输入 2 6.0 2.0 0.0 0.0 0.0 0.0 2.0 -2.0 1.5707963268 样例输出 21.66 提示 本样例中的2张信用卡的轮廓在上图中用实线标出 ...

  5. luogu P3829 [SHOI2012]信用卡凸包 凸包 点的旋转

    LINK:信用卡凸包 当 R==0的时候显然是一个点的旋转 之后再求凸包即可. 这里先说点如何旋转 如果是根据原点旋转的话 经过一个繁杂的推导可以得到一个矩阵. [cosw,-sinw] [sinw, ...

  6. bzoj 1964: hull 三维凸包 计算几何

    1964: hull 三维凸包 Time Limit: 1 Sec  Memory Limit: 64 MBSubmit: 54  Solved: 39[Submit][Status][Discuss ...

  7. 【bzoj2829】信用卡凸包 凸包

    题目描述 输入 输出 样例输入 26.0 2.0 0.00.0 0.0 0.02.0 -2.0 1.5707963268 样例输出 21.66 题解 凸包 傻逼题,答案显然为:所有圆心构成的凸包周长+ ...

  8. 【BZOJ 1027】 (凸包+floyd求最小环)

    [题意] 某公司加工一种由铁.铝.锡组成的合金.他们的工作很简单.首先进口一些铁铝锡合金原材料,不同种类的原材料中铁铝锡的比重不同.然后,将每种原材料取出一定量,经过融解.混合,得到新的合金.新的合金 ...

  9. bzoj 4570: [Scoi2016]妖怪 凸包

    题目大意: http://www.lydsy.com/JudgeOnline/problem.php?id=4570 题解 我们知道如果一个怪物要取到攻击力的最大值,那么一定是把防御力都转化了 所以我 ...

随机推荐

  1. openwrt opkg update wget returned 4 wget returned 1

    最近在正捣鼓mt7620芯片的路由器,刷入openwrt Pandora系统以后想装wifidog实现web认证. 我用我自己的一个水星的路由器PPPOE拨号,通过水星的lan口连接网线到我openw ...

  2. margin系列之内秀篇

    本系列摘自  飘零雾雨的博客 最Cool的利器 一样东西在不同的场景,不同的人手里,所能做的事会有很大不同.我深切的以为 margin 绝对是 CSS 中最有能力的利器之一,不知大家以为然否? 前面几 ...

  3. Yii 跨域设置

    控制器设置: abstract class ControllerBase extends Controller { public function __construct($id, $module, ...

  4. Python冒泡排序

    冒泡排序,顾名思义,按照一定的规则,把数据一直排下去 直接上代码 import random def bubblesort(data): for i in range(len(data)-1,1,-1 ...

  5. git push用法和常见问题分析

    在使用git 处理对android的修改的过程之中总结的.但不完善 Git push $ git push origin test:master         // 提交本地test分支作为远程的m ...

  6. 树莓派上搭建基于Python+web.py+fastcgi+lighttpd的网站

    最近在网上淘了一个树莓派,什么是树莓派?这里是他的官方网站你可以去看看. 简单的说就是一块使用了ARM11的CPU,具有256MB或512MB内存的具有两个USB接口,一个RJ45接口,HDMI输出和 ...

  7. 1.MVC框架开发(初识MVC)

    1.约定大于配置 Content:存放静态文件(样式表.静态图片等) Controllers:存放控制器类 Models:存放数据模型文件 Scripts:存放脚本文件 Views:存放视图文件,里面 ...

  8. bzoj3677: [Apio2014]连珠线

    Description 在列奥纳多·达·芬奇时期,有一个流行的童年游戏,叫做“连珠线”.不出所料,玩这个游戏只需要珠子和线,珠子从1到礼编号,线分为红色和蓝色.游戏 开始时,只有1个珠子,而接下来新的 ...

  9. 类集对enum的支持。

    1,EmumMap public class EnumMap<K extends Enum<K>,V>extends AbstractMap<K,V>impleme ...

  10. java项目打成jar包时引用了第三方jar,此时我们该如何解决呢

    Web项目做多了,反而对单纯的java项目陌生了,今天我们在开发项目的过程中,碰到一个这样的需求:需要将java项目放到linux系统上跑起来,当然这个javaSE项目是带main方法的.我们知道在I ...