题目链接 Balloons in a Box
枚举 一种顺序一个结果,找出最优的那个....
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
#define Pi acos(-1.0)
typedef struct Point{
double x,y,z;
double r;
}Point;
Point s,e,f[10],m[10];
int T;
double GetMin(Point a[],int c)//获得点a[c]扩散的最小半径
{
double t,Min;
Min=min(fabs(a[c].x-s.x),fabs(a[c].x-e.x));
t=min(fabs(a[c].y-s.y),fabs(a[c].y-e.y));
Min=min(t,Min);
t=min(fabs(a[c].z-s.z),fabs(a[c].z-e.z));
Min=min(t,Min);
for(int i=0;i<c;i++)
{
t=sqrt(pow(a[c].x-a[i].x,2.0)+pow(a[c].y-a[i].y,2.0)+pow(a[c].z-a[i].z,2.0))-a[i].r;
Min=min(Min,t);
Min=max(Min,0.0);
}
return Min;
}
double fun(Point a[])//返回按a[]序列扩散的体积
{
double t,sum=0.0;
for(int i=0;i<T;i++)
{
t=GetMin(a,i);//得到a[i]可扩展的最大半径
a[i].r=t;
sum+=pow(t,3.0);
}
return sum;
}
int main()
{ int a[7]={0,1,2,3,4,5,6};
while(~scanf("%d",&T))
{
double Max=0,t;
scanf("%lf%lf%lf%lf%lf%lf",&s.x,&s.y,&s.z,&e.x,&e.y,&e.z);
for(int i=0;i<T;i++)
scanf("%lf%lf%lf",&f[i].x,&f[i].y,&f[i].z);
do
{
for(int i=0;i<T;i++) {m[i]=f[a[i]];m[i].r=0.0;}
t=fun(m);
Max=max(Max,t);
}while(next_permutation(a,a+T));//枚举排列
printf("%.0lf\n",fabs((s.x-e.x)*(s.y-e.y)*(s.z-e.z))-Max*4.0*Pi/3.0);
}
}