资源限制
内存限制:256.0MB C/C++时间限制:1.0s Java时间限制:3.0s Python时间限制:5.0s
问题描述
众所周知,人人都在学习线性代数,既然都学过,那么解决本题应该很方便。
宇宙大战中,qdc在其中建立了许多空间站,这些空间站散落在三维空间中,并且由于宇宙之大,空间站完全可以抽象为一个质点。为了达到毁灭性攻击,qdc可以选择其中4个空间站,然后炸毁其形成的平行六面体空间(如图)。既然是毁灭性的打击,六面体自然要有大的体积,即使他会炸毁自己的空间站。胜利掌握在你的手中,你来编写一个程序输出这个最大的体积。
输入格式
第一行输入一个数,表示空间站数目。
接下来每行三个数,表示这些空间站的三维坐标。
输出格式
一个数字如题所述。
样例输入
4
0 0 0
0 0 1
0 1 0
2 0 0
样例输出
2
数据规模和约定
对于30%的数据n<=5
对于100%的数据4<=n<=10
|xi|,|yi|,|zi|<=512
#include<iostream>
#include<math.h>
using namespace std;
typedef struct Point{
int x;
int y;
int z;
}Point;
Point point[11];
int ans=0;
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
cin>>point[i].x>>point[i].y>>point[i].z;
}
for(int i=1;i<=n;i++){
for(int j=i+1;j<=n;j++){
for(int k=j+1;k<=n;k++){
for(int l=k+1;l<=n;l++){
//求出向量a,b,c,利用混合积:a叉乘b点乘c
int ax=point[j].x-point[i].x;
int ay=point[j].y-point[i].y;
int az=point[j].z-point[i].z;
int bx=point[k].x-point[i].x;
int by=point[k].y-point[i].y;
int bz=point[k].z-point[i].z;
int cx=point[l].x-point[i].x;
int cy=point[l].y-point[i].y;
int cz=point[l].z-point[i].z;
int res=abs(ax*by*cz+ay*bz*cx+az*bx*cy-az*by*cx-bz*cy*ax-cz*ay*bx);
ans=max(res,ans);
}
}
}
}
cout<<ans<<endl;
return 0;
}
思路:四个点可以确定一个六面体的体积,因此在n个点中挑4个点即可,和顺序无关。利用4层for循环来选择4个点,使用混合积求体积。