Liam


私信TA

用户名:Merit

访问量:17192

签 名:

不弥于空想,不骜于虚声

等  级
排  名 173
经  验 6953
参赛次数 17
文章发表 34
年  龄 22
在职情况 在职
学  校 南理工泰科院
专  业 计算机科学与技术

  自我简介:

热爱生活!

解题思路:

对于任意一个给定的房间,以下图中第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 人评分

  评论区

  • «
  • »