【计算几何】ZOJ 2976 Light Bulbs

    点光源到(x,y,z)到它在z=0平面的投影点的光强度最强,然后随着它在z=0平面投影点为圆心的同心圆由里到外强度逐渐减弱,点光源(x,y,z)到(x0,y0,z0)光强度的计算,(I/R^2)*cosi 而cosi=z/R R=distance((x,y,z),(x0,y0,z0))。题目所求的是整点的最强的光强,由上述分析,可知,最强的点不可能“太靠外”,于是枚举 z=0平面的点即可。根据坐标范围,简单枚举了-100到+100的x与y。复杂度100*100*n,差不多有100w。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;

double x[200], y[200], z[200], l[200];
int n;

double oo(double a, double b, int h)
{
    double dis = (x[h] - a) * (x[h] - a) + (y[h] - b)*(y[h] - b) + z[h] * z[h];
    double coss = z[h] / sqrt(dis);
    return l[h] / (dis * 1.0) * coss;
}

void solve()
{
    double maxx= -0x7fffffff;
    double temp;
    for(double i= -100; i <= 100; i++)
    {
        for(double j = -100; j <= 100; j++)
        {
            temp = 0;
            for(int k = 0; k < n; k++)
            {
                temp += oo(i, j, k);
            }
            if(temp > maxx)
                maxx = temp;
        }
    }
    printf("%.2lf\n", maxx);
}

int main()
{
    int T;
    scanf("%d", &T);
    while(T --)
    {
        scanf("%d", &n);
        for(int i=0; i<n; i++)
            scanf("%lf%lf%lf%lf", &x[i], &y[i], &z[i], &l[i]);
        solve();
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值