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;
}
上一题
下一题