zoj 1704 || poj 1569 Myacm Triangles

初看这题,zoj过人才100,poj才400+。。。还以为是啥难题。读了读题,怎么感觉也不像难题啊。。。

 

写了写,结束符没注意0.。。WA了一次,然后A掉了,zoj1A了。。。我去。事实证明,做得人少的不一定是难题啊。。。

 

给你一些点,然后求出一个三角形,满足三角形内部和边上不许有其他点,求这个三角形面积最大。

 

最多才15个点,枚举下,15^4,这个也很小啊 = =。。

 

我判断点在三角形内部用的叉积,在三点的方向一致即可。因为只有三点,不一定是顺时针还是逆时针,都考虑就好了。还可以用面积,如果在三角形内部(或边上),那么到三点的面积一定等于最大面积~

 

#include <stdio.h> #include <stdlib.h> #include <string.h> #include <iostream> #include <algorithm> #include <queue> #include <stack> #include <math.h> using namespace std; const int MAX = 20; const double eps = 1e-6; struct point{ double x,y;}; point p[MAX]; bool dy(double x,double y) { return x > y + eps;} // x > y bool xy(double x,double y) { return x < y - eps;} // x < y bool dyd(double x,double y) { return x > y - eps;} // x >= y bool xyd(double x,double y) { return x < y + eps;} // x <= y bool dd(double x,double y) { return fabs( x - y ) < eps;} // x == y double crossProduct(point a,point b,point c)//向量 ac 在 ab 的方向 { return (c.x - a.x)*(b.y - a.y) - (b.x - a.x)*(c.y - a.y); } double area_triangle(point a,point b,point c) { return fabs( crossProduct(a,b,c) )/2.0; } bool check(int i,int j,int k,int n) { for(int l=0; l<n; l++) if( l != i && l != j && l != k ) { if( dyd(crossProduct(p[i],p[j],p[l]),0.0) && dyd(crossProduct(p[j],p[k],p[l]),0.0) && dyd(crossProduct(p[k],p[i],p[l]),0.0) || xyd(crossProduct(p[i],p[j],p[l]),0.0) && xyd(crossProduct(p[j],p[k],p[l]),0.0) && xyd(crossProduct(p[k],p[i],p[l]),0.0) ) return false; } return true; } int main() { int n; char ch[2]; int out[3]; while( ~scanf("%d",&n) && n ) { double mmax = 0.0; for(int i=0; i<n; i++) scanf("%s %lf %lf",ch,&p[i].x,&p[i].y); for(int i=0; i<n; i++) for(int k=i+1; k<n; k++) for(int j=k+1; j<n; j++) { if( dd(crossProduct(p[i],p[j],p[k]),0.0) ) continue; double area = area_triangle(p[i],p[j],p[k]); if( check(i,j,k,n) ) if( dy(area,mmax) ) { mmax = area; out[0] = i; out[1] = k; out[2] = j; } } printf("%c%c%c/n",out[0]+'A',out[1]+'A',out[2]+'A'); } return 0; }

你可能感兴趣的:(c,struct)