zoukankan      html  css  js  c++  java
  • 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 }
    keep moving...
  • 相关阅读:
    [开发笔记usbTOcan]PyUSB访问设备
    spring之web.xml
    SpringMVC中Controller如何将数据返回
    总结
    流的append
    对象,构造方法、类
    多态
    类的多态性
    环境变量
    构造方法和成员方法的区别
  • 原文地址:https://www.cnblogs.com/xxx0624/p/2961706.html
Copyright © 2011-2022 走看看