点光源到(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;
}