题意 解法 见代码
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 /* 2 几何 3 给定n个普通的点,m个gold点 4 求某个多边形面积和这个多边形的gold数的比值的最小值 5 三角形内点数=|sum(i,k)+sum(j,k)-sum(i,k)|; 6 */ 7 #include<stdio.h> 8 #include<string.h> 9 #include<stdlib.h> 10 #include<algorithm> 11 #include<iostream> 12 #include<queue> 13 //#include<map> 14 #include<math.h> 15 using namespace std; 16 typedef long long ll; 17 //typedef __int64 int64; 18 const int maxn = 205; 19 const int maxm = 505; 20 const int inf = 0x7fffffff; 21 const int pi=acos(-1.0); 22 double ans; 23 struct node{ 24 int x,y; 25 bool operator < ( const node &a ) const { 26 return x<a.x; 27 } 28 }an[ maxn ],am[ maxm ]; 29 int sum[ maxn ][ maxn ];//sum[i][j]:在 第i个点和第j个点之间的线段 上部分的目标点有多少个 30 int cross( int i,int j,int k ){ 31 if( ( (an[ j ].x-an[ i ].x)*(am[ k ].y-an[ i ].y)-(am[ k ].x-an[ i ].x)*(an[ j ].y-an[ i ].y) )>0 ) 32 return 1; 33 else 34 return 0; 35 } 36 double get_area( int i,int j,int k ){ 37 return 0.5*( 1.0*(an[ j ].x-an[ i ].x)*(an[ k ].y-an[ i ].y)-1.0*(an[ k ].x-an[ i ].x)*(an[ j ].y-an[ i ].y) ); 38 } 39 int judge( int i,int j,int k ){ 40 if( an[ i ].x<am[ k ].x&&am[ k ].x<=an[ j ].x ) 41 if( cross(i,j,k) ) 42 return 1; 43 return 0; 44 } 45 void solve( int n,int m ){ 46 for( int i=0;i<n;i++ ){ 47 for( int j=i+1;j<n;j++ ){ 48 sum[ i ][ j ]=0; 49 for( int k=0;k<m;k++ ){ 50 if( judge( i,j,k )==1 ) 51 sum[ i ][ j ]++; 52 } 53 } 54 } 55 for( int i=0;i<n;i++ ){ 56 for( int j=i+1;j<n;j++ ){ 57 for( int k=j+1;k<n;k++ ){ 58 int sum_tmp=sum[ i ][ j ]+sum[ j ][ k ]-sum[ i ][ k ]; 59 double s=get_area( i,j,k ); 60 if( sum_tmp&&( (s=fabs( s/(1.0*sum_tmp) ))<ans ) ) 61 ans=s; 62 } 63 } 64 } 65 return ; 66 } 67 68 int main(){ 69 int ca; 70 scanf("%d",&ca); 71 for( int t=1;t<=ca;t++ ){ 72 int n,m; 73 scanf("%d%d",&n,&m); 74 for( int i=0;i<n;i++ ) 75 scanf("%d%d",&an[ i ].x,&an[ i ].y); 76 sort( an,an+n ); 77 for( int i=0;i<m;i++ ) 78 scanf("%d%d",&am[ i ].x,&am[ i ].y); 79 ans=inf*1.0; 80 solve( n,m ); 81 if( ans!=inf*1.0 ) 82 printf("Case #%d: %lf\n",t,ans); 83 else 84 printf("Case #%d: -1\n",t); 85 } 86 return 0; 87 }