http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=19099
给定一些点,求构成三角形最大面积,并且这个三角形不能不能包含其他点(在边上也不行)。
因为数据范围很小,所以直接枚举就好,并且还把面积公式告诉了我们,判断点在三角形内的方法是,这个点与其他顶点的面积之和是否等于这个三角形的面积。
#include<cstdio>
#include<cmath>
struct point
{
char z;
int x,y;
}p[20];
double area(point a,point b,point c)
{
return fabs(0.5*((c.y-a.y)*(b.x-a.x)-(b.y-a.y)*(c.x-a.x)));
}
bool check(point a,point b,point c,point d)
{
if((area(a,b,d)+area(b,d,c)+area(a,d,c))==area(a,b,c)) return 1;
else return 0;
}
int main()
{
//freopen("a.txt","r",stdin);
int n,i,j,k,l;
while(~scanf("%d",&n))
{
if(n==0) break;
getchar();
for(i=0;i<n;i++)
{
scanf("%c %d %d",&p[i].z,&p[i].x,&p[i].y);
//printf("%c %d %d\n",p[i].z,p[i].x,p[i].y);
getchar();
}
double s,sum=0;
char a,b,c;
for(i=0;i<n;i++)
{
for(j=i+1;j<n;j++)
{
for(k=j+1;k<n;k++)
{
s=area(p[i],p[j],p[k]);
if(s>sum)
{
for(l=0;l<n;l++)
{
if(l!=i&&l!=j&&l!=k&&check(p[i],p[j],p[k],p[l])) break;
}
if(l==n)
{
sum=s;
a=p[i].z;
b=p[j].z;
c=p[k].z;
}
}
}
}
}
printf("%c%c%c\n",a,b,c);
}
return 0;
}