先将所给直线按b值排序,b值小的直线若想最后在上面,就必须比当前最小的斜率小,或者比最大的斜率大
所以最小斜率和最大斜率弄2个栈,我是弄一个数组,把起点放在中间
如果斜率满足,就看他是否覆盖了之前的线,类似于凸包中的退栈方法
#include <stdio.h>
#include <math.h>
#include <iostream>
#include <algorithm>
using namespace std;
struct deng
{
double x,y,z,i;
};deng d[105];
double dis(int k,int b,int c)
{
return sqrt(double((d[k].x-b)*(d[k].x-b)+(d[k].y-c)*(d[k].y-c)+d[k].z*d[k].z));
}
int main()
{
int cas,n,i,j,k;
cin>>cas;
while(cas--)
{
cin>>n;
double maxe=0,e;
for(i=0;i<n;i++)
cin>>d[i].x>>d[i].y>>d[i].z>>d[i].i;
for(i=-100;i<=100;i++)
for(j=-100;j<=100;j++)
{
e=0;
for(k=0;k<n;k++)
{
double l=dis(k,i,j);
e+=1.0*d[k].z*d[k].i/l/l/l;
}
maxe=max(maxe,e);
}
printf("%.2lf\n",maxe);
}
return 0;
}