HDU 4353 几何

题意 解法 见代码

View Code
 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 }

 

posted @ 2013-03-15 16:36  xxx0624  阅读(242)  评论(0编辑  收藏  举报