Description
平面上有N颗树,标号从1到N,每颗树有坐标(Xi, Yi)。要求在平面上找几棵树,在一些树之间建篱笆形成一个闭合图形(篱笆不能在除了树以外的地方相交,形成的图形面积不能为0).求最小可能围成的面积。
Input
第一行输入N。
然后N行第i行输入第i棵树的坐标Xi和Yi。
Output
输出最小围成的面积,小数点后保留两位小数。无解输出“Impossible”
Sample Input
4
-1.00 0.00
0.00 -3.00
2.00 0.00
2.00 2.00
Sample Output
2.00
Data Constraint
对于40%数据 1 ≤ N ≤ 20
对于所有数据 1 ≤ N ≤ 100,-1000 ≤ Xi,Yi ≤ 1000
分析:面积最小的一定是三角形,暴力三个点判断即可。二个点及所有点在一直线上为impossible。
代码:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<cmath>
#define inf 2000000000
#define N 103
#define fo(i,a,b) for (int i=a;i<=b;i++)
using namespace std;
int n,i;
double x[N],y[N],ans;
int main()
{
scanf("%d",&n);
fo(i,1,n)
{
scanf("%lf%lf",&x[i],&y[i]);
}
ans=inf;
fo(i,1,n)
fo(j,1,n)
fo(k,1,n)
{
if ((i!=j) && (i!=k) && (j!=k))
{
double s=abs((x[j]-x[i])*(y[k]-y[i])-(y[j]-y[i])*(x[k]-x[i]))/2;
if (s!=0) ans=min(ans,s);
}
}
if (ans==inf) printf("Impossible");
else printf("%.2lf",ans);
}