Chinaunix首页 | 论坛 | 博客
  • 博客访问: 452030
  • 博文数量: 98
  • 博客积分: 6011
  • 博客等级: 准将
  • 技术积分: 1030
  • 用 户 组: 普通用户
  • 注册时间: 2006-11-23 13:19
文章分类

全部博文(98)

文章存档

2011年(2)

2009年(2)

2008年(31)

2007年(35)

2006年(28)

我的朋友

分类:

2008-05-18 22:25:37

题目:
这是上次浙大比赛的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) |
给主人留下些什么吧!~~