【2011 Greater New York Regional 】Problem I :The Golden Ceiling
一道比较简单但是繁琐的三维计算几何,找错误找的我好心酸,没想到就把一个变量给写错了 = =;
题目的意思是求平面切长方体的截面面积+正方体顶部所遮盖的面积;
找出所有的切点,然后二维凸包一下直接算面积即可!
发个代码纪念一下!
代码:
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<cstring>
#define eps 1e-8
using namespace std; inline int sig(double x){return (x>eps)-(x<-eps);}
double w,l,hh,aa,bb,cc,dd;
int num1,num2;
struct point
{
double x,y,z;
point(double x=,double y=,double z=):x(x),y(y),z(z) { }
bool operator < (const point &t)const
{
if(sig(x-t.x)==)
{
return y<t.y;
}
else return x<t.x;
}
point operator+(const point&b)const{return point(x+b.x,y+b.y,z+b.z);}
point operator-(const point&b)const{return point(x-b.x,y-b.y,z-b.z);}
point operator*(double p){return point(x*p,y*p,z*p);}
point operator/(double p){return point(x/p,y/p,z/p);}
} ve[],tu[],vv[],tt[]; void intersection(point a,point b)
{
double t=(aa*a.x+bb*a.y+cc*a.z+dd)/(aa*(a.x-b.x)+bb*(a.y-b.y)+cc*(a.z-b.z));
if(t>=-eps&&t<=1.00000+eps)
{
point v=a+(b-a)*t;
ve[num1++]=v;
if(sig(v.z-hh)==)
tu[num2++]=v;
}
}
double lenth(point a){return sqrt(a.x*a.x+a.y*a.y+a.z*a.z);}
point cross(point a,point b){return point(a.y*b.z-a.z*b.y,a.z*b.x-a.x*b.z,a.x*b.y-a.y*b.x);}
double area(point a,point b,point c){return lenth(cross(b-a,c-a))/2.0;}
double cross2(point a,point b){return a.x*b.y-a.y*b.x;}
bool check(point a)
{
if(sig(aa*a.x+bb*a.y+cc*a.z+dd)<)
return ;
return ;
} int convexhull(point *p,int n,point* ch)
{
sort(p,p+n);
int m=;
for(int i=;i<n;i++)
{
while(m>&&cross2(ch[m-]-ch[m-],p[i]-ch[m-])<=eps)m--;
ch[m++]=p[i];
}
int k=m;
for(int i=n-;i>=;i--)
{
while(m>k&&cross2(ch[m-]-ch[m-],p[i]-ch[m-])<=eps)m--;
ch[m++]=p[i];
}
if(n>)m--;
return m;
} int main()
{
int t,ca;
scanf("%d",&t);
while(t--)
{
memset(tu,,sizeof tu);
memset(ve,,sizeof ve);
memset(vv,,sizeof vv);
memset(tt,,sizeof tt);
scanf("%d",&ca);
printf("%d ",ca);
scanf("%lf%lf%lf%lf%lf%lf%lf",&l,&w,&hh,&aa,&bb,&cc,&dd);
num1=num2=;
dd=-dd;
point a(0.0,0.0,0.0);
point b(l,0.0,0.0);
point c(l,w,0.0);
point d(0.0,w,0.0);
point e(0.0,0.0,hh);
point f(l,0.0,hh);
point g(l,w,hh);
point h(0.0,w,hh);
intersection(a,b);
intersection(b,c);
intersection(c,d);
intersection(d,a);
intersection(a,e);
intersection(b,f);
intersection(c,g);
intersection(d,h);
intersection(e,f);
intersection(f,g);
intersection(g,h);
intersection(h,e);
if(check(e)==)tu[num2++]=e;
if(check(f)==)tu[num2++]=f;
if(check(g)==)tu[num2++]=g;
if(check(h)==)tu[num2++]=h;
int x=convexhull(ve,num1,vv);
int y=convexhull(tu,num2,tt);
double ans=;
for(int i=;i<x;i++)
ans+=area(vv[],vv[i-],vv[i]);
for(int i=;i<y;i++)
ans+=area(tt[],tt[i-],tt[i]);
printf("%.0lf\n",ceil(ans));
}
return ;
}
【2011 Greater New York Regional 】Problem I :The Golden Ceiling的更多相关文章
- 【2011 Greater New York Regional 】Problem G: Rancher's Gift
计算几何的题目,很简单: 自己随手敲了个,纪念下! #include<cstdio> #include<cmath> using namespace std; struct p ...
- 【2011 Greater New York Regional 】Problem H: Maximum in the Cycle of 1
也是一个数学题: 主要用到的是排列组合的知识,推推公式就行了,挺简单的: 唯一要注意的是A(0,0)=1: 在这个上面WA了几次,= = 代码: #include<stdio.h> #de ...
- 【2011 Greater New York Regional 】Problem B The Rascal Triangle
一个简单的规律题,每一列都是一个等差数列: 代码: #include<cstdio> #define ll long long using namespace std; int main( ...
- Poj(2407),Greater New York Regional 2015 (D)
题目链接:http://poj.org/problem?id=2407 Relatives Time Limit: 1000MS Memory Limit: 65536K Total Submis ...
- 【2011集训贾志鹏】Crash 的数字表格
题面 题目分析 (默认\(n<m\)) 题目要求\(\sum\limits_{i=1}^n\sum\limits_{j=1}^mlcm(i,j)\). 由\(lcm(i,j)=\frac{i\c ...
- [NOIp 1998 提高组]Probelm 2 连接多位数【2011百度实习生笔试题】
/*====================================================================== [NOIp 1998 提高组]Probelm 2 连接 ...
- 【贪心+中位数】【新生赛3 1007题】 Problem G (K)
Problem G Time Limit : 4000/2000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) Total Sub ...
- 【2011图灵奖得主】我眼中的Judea Pearl
[2011图灵奖得主]我眼中的Judea Pearl 来源: 叶星遥的日志 2011年的图灵奖花落UCLA计算机系的Judea Pearl教授.图灵奖是计算领域的最高奖,由于近年来这个领域的兴盛也算是 ...
- 【BZOJ2998】Problem A(动态规划)
[BZOJ2998]Problem A(动态规划) 题面 BZOJ 题解 一个人的成绩范围可以确定为一个区间 这样就变成了 选择若干区间,不重合, 每个区间有个权值,求最大权值和 这样就可直接\(dp ...
随机推荐
- 全球5大安全工具Linux发行版本
全球5大安全工具Linux发行版本http://automationqa.com/forum.php?mod=viewthread&tid=2314&fromuid=21
- mysql 中间件 分析
360的Atlas 1.读写分离 2.从库负载均衡 3.IP过滤 4.自动分表 5.DBA可平滑上下线DB 6.自动摘除宕机的DB altas 在10000/s的请求量级应该是毫无问题的 https: ...
- 安卓项目-利用Sqlite数据库,开发新闻发布系统
本教程致力于程序员可以快速的学习安卓移动端手机开发. 适合于已经习得一种编程语言的同仁. 更多志同道合,想要学习更多编程技术的大神们. 小弟不才,麻烦关注一下我的今日头条号-做全栈攻城狮. 本文章是基 ...
- ImageView的属性android:scaleType
ImageView的属性android:scaleType,即 ImageView.setScaleType(ImageView.ScaleType). android:scaleType是控制图片如 ...
- Sun开发的JINI技术在网络中的应用
一.概述 Sun公司开发的Jini系统是一种创新技术,听说它的人很多但较少被人理解.Jini系统可利用Java扩展网络计算的范围,并有可能成为最佳解决方案. Jini是Sun公司的研究与开发项目,它能 ...
- web开发学习之旅---html第二天
一.转义符 一些字符在html中拥有特殊的含义,比如小于号(<)用于定义 HTML 标签的开始.如果我们希望浏览器正确地显示这些字符,我们必须在 HTML 源码中插入转义符. 分类 二.html ...
- C++Primer笔记一
作为一名半路出家的JAVA程序员,又要开始学半路中放弃的C++了,因为真的很重要. 先来看一段代码, #include <iostream> using namespace std; i ...
- C#学习笔记(3)
先理解一下方法重写和方法重载这2个概念: 1.方法重写(override):发生在父子类之间,子类重写父类中的方法,关键字是override. 2.方法重载(overload):一个类中有多个重名的方 ...
- Windows Server 2008 计划任务配置(任务计划程序)每分钟执行BAT
首先Windows Server 2008不同于其他服务器操作系统和Windows Server 2003有着很大的区别,计划任务的名称是“任务计划程序”不在控制面板里,而是在“管理工具”里. 由于服 ...
- Java线程间通信-回调的实现方式
Java线程间通信-回调的实现方式 Java线程间通信是非常复杂的问题的.线程间通信问题本质上是如何将与线程相关的变量或者对象传递给别的线程,从而实现交互. 比如举一个简单例子,有一个多线程的 ...