zoukankan      html  css  js  c++  java
  • hdu 4380 Farmer Greedy (计算几何 2012 MultiUniversity Training Contest 9 )

    http://acm.hdu.edu.cn/showproblem.php?pid=4380

     题意:  给出 n个房子的位置 。和 m个 金矿的位置 ,从  n 个房子里选出三个(组成三角形),求出有多少种选法 是 三角形 内的金矿数为 奇数?

    题解:

     预处理  枚举 从 n 个房子里 选出 2个i,j 记录 在其上方的 金矿数dp[i][j],枚举所有的三角形 那么 三角形 内的点为  fabs(dp[i][k] - dp][i][j] - dp[j][k]);

     1 #include<cstdio>
     2 #include<cstring>
     3 #include<cmath>
     4 #include<iostream>
     5 #include<algorithm>
     6 #include<set>
     7 #include<map>
     8 #include<queue>
     9 #include<vector>
    10 #include<string>
    11 #define Min(a,b) a<b?a:b
    12 #define Max(a,b) a>b?a:b
    13 #define CL(a,num) memset(a,num,sizeof(a));
    14 #define maxn  120
    15 #define eps  1e-8
    16 #define inf 100000000
    17 #define mx 1<<60
    18 #define ll   __int64
    19 using namespace std;
    20 struct house
    21 {
    22     double  x;
    23     double y;
    24 }a[maxn],b[maxn * 10];
    25 int cmp(house a,house b)
    26 {
    27     if(a.x == b.x) return a.y < b.y ;
    28     else  return a.x < b.x ;
    29 }
    30 double  in(house a,house b,house c)
    31 {
    32      return (b.x-a.x)*(c.y-a.y)-(b.y-a.y)*(c.x-a.x);
    33 }
    34 
    35 int dp[maxn][maxn] ;
    36 int main()
    37 {
    38     int n,m,i,j,k;
    39      int cas = 0;
    40     while(scanf("%d%d",&n,&m)!=EOF)
    41     {
    42 
    43         for(i = 0; i < n;i++)
    44          {
    45              scanf("%lf%lf",&a[i].x,&a[i].y);
    46          }
    47          sort(a,a + n,cmp);
    48          for(i = 0; i < m;i++)
    49          {
    50              scanf("%lf%lf",&b[i].x,&b[i].y);
    51          }
    52 
    53          for(i = 0 ; i < n  ;i++)
    54          {
    55              for(j = i + 1; j < n;j++)
    56              {
    57 
    58                  dp[i][j] = 0;
    59                  for(k = 0;k < m;k++)
    60                  {
    61                     if(b[k].x >= a[i].x && b[k].x < a[j].x )//注意 右边要是开区间 (以免重减)
    62                         if(in(a[i],a[j],b[k]) > 0) dp[i][j]++;
    63                  }
    64 
    65              }
    66          }
    67          int  ans = 0;
    68          for(i = 0 ; i < n  ;i++)
    69          {
    70              for(j = i + 1 ;j < n  ;j++)
    71              {
    72                  for(k = j + 1; k < n ;k++)
    73                  {
    74 
    75                    int  tmp = abs(dp[i][k] - dp[i][j] - dp[j][k]) ;
    76 
    77                    if(tmp&1) ans ++;
    78 
    79                  }
    80              }
    81          }
    82         printf("Case %d: %d\n", ++cas, ans);
    83 
    84     }
    85 }
  • 相关阅读:
    Winform中用了皮肤控件之后,报错:容量超出了最大容量 参数名:capacity
    C# 生成二维码
    T-sql语句修改数据库逻辑名、数据库名、物理名
    ASP.NET MVC中使用jQuery时的浏览器缓存问题
    关于asp.net页面缓存
    关于VS 工具箱灰色,不可用的解决方案
    Android
    如何让一个DIV水平,垂直方向都居中于浏览器?
    cookie.setPath()的用法
    CSS选择器
  • 原文地址:https://www.cnblogs.com/acSzz/p/2650985.html
Copyright © 2011-2022 走看看