测评会员优惠活动进行中 · 开通 VIP,有效期内测评不限次 VIP 优惠中 · 测评不限次 立即查看

A40902. 农场阳光

填空题 困难

题目描述

农场阳光

题目描述

X星球十分特殊,它的自转速度与公转速度相同,所以阳光总是以固定的角度照射。

最近,X星球为发展星际旅游业,把空间位置出租给Y国游客来晒太阳。每个租位是漂浮在空中的圆盘形彩云(圆盘与地面平行)。当然,这会遮挡住部分阳光,被遮挡的土地植物无法生长。

本题的任务是计算某个农场宜于作物生长的土地面积有多大。

输入格式

输入数据的第一行包含两个整数a,  b,表示某农场的长和宽分别是a和b,此时,该农场的范围是由坐标(0,  0,  0),  (a,  0,  0),  (a,  b,  0),  (0,  b,  0)围成的矩形区域。 

第二行包含一个实数g,表示阳光照射的角度。简单起见,我们假设阳光光线是垂直于农场的宽的,此时正好和农场的长的夹角是g度,此时,空间中的一点  (x,  y,  z)在地面的投影点应该是(x  +  z  *  ctg(g度),  y,  0),其中ctg(g度)表示g度对应的余切值。 

第三行包含一个非负整数n,表示空中租位个数。 

接下来  n  行,描述每个租位。其中第i行包含4个整数xi,  yi,  zi,  ri,表示第i个租位彩云的圆心在(xi,  yi,  zi)位置,圆半径为ri。 

输出格式

要求输出一个实数,四舍五入保留两位有效数字,表示农场里能长庄稼的土地的面积。 

样例输入

10 10 

90.0 

1 

5 5 10 5

样例输出

21.46

参考答案

#include <iostream> #include <cmath> #define PI 3.1415926 using namespace std; int main() { int a,b,n,x[100],y[100],z[100],r[100]; int sun_S=0,distance1=0; double g,xi[100],yi[100],zi[100],ri[100]; for(int i=0;i<100;i++) { x[i]=0; y[i]=0; z[i]=0; r[i]=0; xi[i]=0; yi[i]=0; zi[i]=0; ri[i]=0; } cin>>a>>b>>g>>n; for(int i=0;i<n;i++) { cin>>x[i]>>y[i]>>z[i]>>r[i]; xi[i]=x[i]+z[i]*1/tan(g*PI/180.0); yi[i]=y[i]; zi[i]=0; ri[i]=r[i]; x[i]=xi[i]*1000; y[i]=yi[i]*1000; z[i]=zi[i]*1000; r[i]=ri[i]*1000; } int farm_a=a*1000,farm_b=b*1000,flag=0; for(int i=0;i<farm_b;i++) { for(int j=0;j<farm_a;j++) { for(int z=0;z<n;z++) { distance1=sqrt( (j-x[z])*(j-x[z])+(i-y[z])*(i-y[z]) ); if(distance1<r[z]) { flag++; break; } } for(int z=0;z<n;z++) { distance1=sqrt( (j+1-x[z])*(j+1-x[z])+(i-y[z])*(i-y[z]) ); if(distance1<r[z]) { flag++; break; } } for(int z=0;z<n;z++) { distance1=sqrt( (j-x[z])*(j-x[z])+(i+1-y[z])*(i+1-y[z]) ); if(distance1<r[z]) { flag++; break; } } for(int z=0;z<n;z++) { distance1=sqrt( (j+1-x[z])*(j+1-x[z])+(i+1-y[z])*(i+1-y[z]) ); if(distance1<r[z]) { flag++; break; } } if(flag<2) { sun_S++; flag=0; } else flag=0; } } double answer=((double)(sun_S))/(1000*1000); printf("%.2lf",answer+0.01); return 0; }
上一题 下一题