解题思路:
对于任意一个给定的房间,以下图中第2栋楼的202室为例,在太阳位于正上方的时候肯定可以完全被阳光照射。在这之前有一一个刚开始被照射的最小角度,最小角度取决于这栋楼左边的楼房对太阳光的遮挡。对左边的楼房一栋一栋地检查,以右上角的顶点为基准,连一条:线到所求房间的左下角,求这条线的倾斜角。倾斜角最大的线就是使得所求房间刚开始被太阳
光照射到的最小角度。同理,在这之后有一个刚结束被照射的最大角度,最大角度取决于右边的楼房对太阳光的遮挡。同样对右边的楼房一栋一 栋地检查,以左上角的顶点为基准,连一条线到所求房间的右下角,求这条线的倾斜角。倾斜角最小的线就是使得所求房间刚结束被太阳光照射到的最大角度,如图所示。最后将这两个角度转化成时间并输出
注意事项:
参考代码:
#include<cstdio>
#include<math.h>
int n,h[111],d[111],width,height,sum,i,di,num,level,id;
int cases,dh,dw,h1,m1,h2,m2;
double min,max,angle,Half_pi;//min和max向下取整对应的开始时间和结束时间的秒,half_Pi为π/2 angle存储照射角
int main()
{
Half_pi=acos(0);
while(scanf("%d",&n) && n)
{
scanf("%d%d",&width,&height);
sum=0;
for(i=0;i<n;i++)
{
scanf("%d",&h[i]);
d[i]=sum;
if(i<n-1)
{
scanf("%d",&di);
sum+=di+width;
}
}
int flag=1;
//printf("Apartment Complex: %d\n",++cases);
while(scanf("%d",&num)&&num)
{
if(flag==1)
{
printf("Apartment Complex: %d\n",++cases);
flag=0;
}
printf("Apartment %d: ",num);
level=num/100-1;
id=num%100-1;
if(id<0 || id>=n || level<0 || level>=h[id])
{
puts("Dose not exist");
continue;
}
min=0;
max=0;
for(i=0;i<id;i++)
{
dw=d[id]-d[i]-width;
dh=height*(h[i]-level);
if(dh>0)
{
angle=asin(dh/sqrt(dh*dh+dw*dw));
if(angle>min)
{
min=angle;
}
}
}
for(i=id+1;i<n;i++)
{
dw=d[i]-d[id]-width;
dh=height*(h[i]-level);
if(dh>0)
{
angle=asin(dh/sqrt(dh*dh+dw*dw));
if(angle>max)
{
max=angle;
}
}
}
min=20220+22800*min/Half_pi;
max=65820-22800*max/Half_pi;
h1=int(min/3600);
min-=h1*3600;
m1=int(min/60);
min-=m1*60;
h2=int(max/3600);
max-=h2*3600;
m2=int(max/60);
max-=m2*60;
printf("%02d:%02d:%02d-%02d:%02d:%02d\n",h1,m1,int(min),h2,m2,int(max));
}
}
return 0;
}0.0分
1 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复