hdu4353 Finding Mine三角形内的点数
http://acm.hdu.edu.cn/showproblem.php?pid=4353
题意:
求多边形面积和这个多边形内的金矿数的比值的最小值。
当xi<xj<xk时:
三角形内的点数=|ik上方的点-(ij上方的点+jk上方的点)|
1 #include <iostream> 2 #include <cstdio> 3 #include <algorithm> 4 using namespace std; 5 const int Ni = 205; 6 const int Mi = 505; 7 int n,m; 8 double mx; 9 struct node{ 10 int x,y;//注意数据的范围,是否超int 11 bool operator < (const node &a) const 12 { 13 return x<a.x; 14 } 15 }a[Ni],b[Mi]; 16 int sum[Ni][Ni]; 17 inline double fabs(double a) 18 { 19 if(a>1e-8) return a; 20 if(-a>1e-8) return -a; 21 return 0; 22 } 23 bool cross(int i,int j,int k) 24 { 25 if(0<(a[j].x-a[i].x)*(b[k].y-a[i].y)-(a[j].y-a[i].y)*(b[k].x-a[i].x)) 26 return 1; 27 else return 0; 28 } 29 inline int area(int i,int j,int k) 30 { 31 return (a[j].x-a[i].x)*(a[k].y-a[i].y)-(a[j].y-a[i].y)*(a[k].x-a[i].x); 32 } 33 inline bool judge(int i,int j,int k) 34 { 35 if(a[i].x<b[k].x&&b[k].x<=a[j].x){ 36 if(cross(i,j,k)) return 1; 37 } 38 return 0; 39 } 40 void finds() 41 { 42 int i,j,k; 43 for(i=0;i<n;i++) 44 for(j=i+1;j<n;j++) 45 { 46 sum[i][j]=0; 47 for(k=0;k<m;k++) if(judge(i,j,k)) 48 sum[i][j]++; 49 } 50 mx=1<<27; 51 for(i=0;i<n;i++) 52 for(j=i+1;j<n;j++) 53 for(k=j+1;k<n;k++) 54 { 55 int ans=sum[i][k]-sum[i][j]-sum[j][k]; 56 double s=area(i,j,k); 57 if(ans&&(s=fabs(s/ans))<mx) 58 { 59 mx=s; 60 } 61 } 62 } 63 int main() 64 { 65 int cs=1,tcs,i; 66 scanf("%d",&tcs); 67 while(tcs--) 68 { 69 scanf("%d%d",&n,&m); 70 for(i=0;i<n;i++) scanf("%d%d",&a[i].x,&a[i].y); 71 sort(a,a+n); 72 for(i=0;i<m;i++) scanf("%d%d",&b[i].x,&b[i].y); 73 finds(); 74 if(mx!=1<<27) 75 printf("Case #%d: %lf\n",cs++,mx/2); 76 else 77 printf("Case #%d: -1\n",cs++); 78 } 79 return 0; 80 }