• POJ 2318 TOYS && POJ 2398 Toy Storage(几何)


    2318 TOYS

    2398 Toy Storage

    题意 : 给你n块板的坐标,m个玩具的具体坐标,2318中板是有序的,而2398无序需要自己排序,2318要求输出的是每个区间内的玩具数,而2318要求输出的是有 i 个玩具的区间有几个。

    思路 : 两个题基本差不多,只不过2398排一下序,然后再找个数组标记一下就行。

    这个题我一开始没想到用二分,判断了点在四边形内但是没写下去,然后看了网上的二分区间,利用叉积判断点在左边还是右边。

    2318代码:

     1 #include <stdio.h>
     2 #include <string.h>
     3 #include <math.h>
     4 #include <iostream>
     5 
     6 using namespace std ;
     7 
     8 struct point
     9 {
    10     int x,y ;
    11 }p ;
    12 struct line
    13 {
    14     point a,b ;
    15 } eline[5120] ;
    16 
    17 int s[5120] ;
    18 
    19 int xmult(point p1,point p2,point p0)
    20 {
    21     return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y) ;
    22 }
    23 
    24 void binary_searc(point p,int a)
    25 {
    26     int l = 0, r = a-1 ,mid ;
    27     while(l < r)
    28     {
    29         mid = (l + r) /2 ;
    30         if(xmult(p,eline[mid].a,eline[mid].b) > 0) l = mid+1 ;
    31         else r = mid ;
    32     }
    33     if(xmult(p,eline[l].a,eline[l].b) < 0) s[l] ++ ;
    34     else s[l+1] ++ ;
    35 }
    36 int main()
    37 {
    38     int m,n,x1,x2,y1,y2 ;
    39     while(scanf("%d",&n) != EOF)
    40     {
    41         if(n == 0) break ;
    42         scanf("%d %d %d %d %d",&m,&x1,&y1,&x2,&y2) ;
    43         memset(s,0,sizeof(s)) ;
    44         for(int i = 0 ; i < n ; i++)
    45         {
    46             scanf("%d %d",&eline[i].a.x,&eline[i].b.x) ;
    47             eline[i].a.y = y1 ;
    48             eline[i].b.y = y2 ;
    49         }
    50         for(int i = 0 ; i < m ; i++)
    51         {
    52             scanf("%d %d",&p.x,&p.y) ;
    53             binary_searc(p,n) ;
    54         }
    55         for(int i = 0 ; i <= n ; i++)
    56             printf("%d: %d
    ",i,s[i]) ;
    57         printf("
    ") ;
    58     }
    59     return 0 ;
    60 }
    View Code

    2398代码 :

     1 #include <stdio.h>
     2 #include <string.h>
     3 #include <math.h>
     4 #include <iostream>
     5 #include <algorithm>
     6 
     7 using namespace std ;
     8 
     9 struct point
    10 {
    11     int x,y ;
    12 }p ;
    13 struct line
    14 {
    15     point a,b ;
    16 } eline[1120] ;
    17 
    18 int s[1120],s1[1120] ;
    19 
    20 int xmult(point p1,point p2,point p0)
    21 {
    22     return (p1.x-p0.x)*(p2.y-p0.y)-(p2.x-p0.x)*(p1.y-p0.y) ;
    23 }
    24 
    25 int cmp(const line &aa,const line &bb)
    26 {
    27      if (min(aa.a.x, aa.b.x) == min(bb.a.x, aa.b.x))
    28         return max(aa.a.x, aa.b.x) < max(bb.a.x, bb.b.x);
    29     return min(aa.a.x, aa.b.x) < min(bb.a.x, aa.b.x);
    30 }
    31 void binary_searc(point p,int a)
    32 {
    33     int l = 0, r = a-1 ,mid ;
    34     while(l < r)
    35     {
    36         mid = (l + r) /2 ;
    37         if(xmult(p,eline[mid].a,eline[mid].b) > 0) l = mid+1 ;
    38         else r = mid ;
    39     }
    40     if(xmult(p,eline[l].a,eline[l].b) < 0) s[l] ++ ;
    41     else s[l+1] ++ ;
    42 }
    43 int main()
    44 {
    45     int m,n,x1,x2,y1,y2 ;
    46     while(scanf("%d",&n) != EOF)
    47     {
    48         if(n == 0) break ;
    49         scanf("%d %d %d %d %d",&m,&x1,&y1,&x2,&y2) ;
    50         memset(s,0,sizeof(s)) ;
    51         memset(s1,0,sizeof(s1)) ;
    52         for(int i = 0 ; i < n ; i++)
    53         {
    54             scanf("%d %d",&eline[i].a.x,&eline[i].b.x) ;
    55             eline[i].a.y = y1 ;
    56             eline[i].b.y = y2 ;
    57         }
    58         sort(eline,eline+n,cmp) ;
    59         for(int i = 0 ; i < m ; i++)
    60         {
    61             scanf("%d %d",&p.x,&p.y) ;
    62             binary_searc(p,n) ;
    63         }
    64         for(int i = 0 ; i <= n ; i++)
    65             s1[s[i]] ++ ;
    66             printf("Box
    ") ;
    67         for(int i = 1 ; i <= m ; i++)
    68         {
    69             if(s1[i] != 0)
    70                 printf("%d: %d
    ",i,s1[i]) ;
    71         }
    72 //        for(int i = 0 ; i <= n ; i++)
    73 //            printf("%d: %d
    ",i,s[i]) ;
    74 //        printf("
    ") ;
    75     }
    76     return 0 ;
    77 }
    View Code
  • 相关阅读:
    014、BOM与DOM对象的应用
    013、BOM对象的应用
    001.JS特效
    开发技巧
    AndroidStudio中使用SVN
    AndroidStudio碰到的各种问题
    Activity的生命周期和启动模式
    03.Java多线程并发库API使用2
    php的memcache和memcached扩展区别
    js:关于IE6/7下new Date(值)输出为NaN的解决方案
  • 原文地址:https://www.cnblogs.com/luyingfeng/p/3683927.html
Copyright © 2020-2023  润新知