题目:
这是上次浙大比赛的1012题,题目大意是说,装修一个房子,要在天花板上装很多灯泡,然后给出计算灯泡照射到地板上某点时的光强,如果几个灯都可以照到同一点,该点的光强等于各个灯泡照过来的效果叠加。。求出地板上最大光强的点。。注意的是:灯泡安装的地方的横坐标和纵坐标都是整数,而且要求的地板上最大光强的点的横坐标和纵坐标也为整数。。
大致思路:记录下所有灯泡中的最大最小横坐标和纵坐标,然后枚举这两个坐标构成的矩形内所有的点,对每个点求出其光强,并记录下最大的即可,时间复杂度为O(n^3)。。。开始以为这样做会TLE,忐忑地交上去,居然没有。。。
my code:
#include<iostream> #include<cmath> using namespace std; struct Light { double x,y,z; double lum; }; double fun(Light k,int x,int y)//根据公式计算单个点的光强 { double r=(k.x-x)*(k.x-x)+(k.y-y)*(k.y-y)+k.z*k.z; double c=k.z/sqrt(r); return k.lum*c/r; } int main() { int t,i,n,k,j,m,l; Light light[105]; double maxx,maxy,minx,miny,max,temp,s; cin>>t; while(t--) { cin>>n;maxx=maxy=-150;minx=miny=150; for(i=1;i<=n;i++) { cin>>light[i].x>>light[i].y>>light[i].z>>light[i].lum; if(maxx<light[i].x) maxx=light[i].x; if(maxy<light[i].y) maxy=light[i].y; if(minx>light[i].x) minx=light[i].x; if(miny>light[i].y) miny=light[i].y; } k=int(maxx);m=int(maxy);max=-150; for(i=int(minx);i<=k;i++) for(j=int(miny);j<=m;j++) { s=0; for(l=1;l<=n;l++) { temp=fun(light[l],i,j); s+=temp; } if(max<s) max=s; } printf("%.2lf\n",max); } return 0; }
|
阅读(1375) | 评论(0) | 转发(0) |