• POJ2318TOYS(叉乘)


    题意:给你一个箱子,已知隔板的位置,在给你玩具的位置,要你算出每个被隔出来的区域里有几个玩具。。。

    想法:利用叉乘,某玩具在X区域里,那么,这个点就在第x-1条线的右手边,第x条线的左手边,左右手方向利用叉乘来判断。。另外,我把左右边界也加入进了所以的线里面。。这样就不需要特殊判断了。。。

     1 #include<stdio.h>
     2 #include<string.h>
     3 typedef struct point
     4 {
     5     int x,y;
     6 }point;
     7 typedef struct line
     8 {
     9     point a,b;
    10 }line;
    11 line l[5010];
    12 int n;
    13 int cross(point a,point b)
    14 {
    15     return (a.x*b.y-a.y*b.x);
    16 }
    17 point getvector(point a,point b)
    18 {
    19     point get;
    20     get.x=b.x-a.x;
    21     get.y=b.y-a.y;
    22     return get;
    23 }
    24 int judge(point dot)
    25 {
    26     int mid,low,high,d1,d2,j;
    27 
    28     low=0;
    29     high=n+1;
    30     while(low<=high)
    31     {
    32         mid=(high+low)/2;
    33         d1=cross(getvector(l[mid].a,dot),getvector(l[mid].b,dot));
    34         if(d1<=0)
    35         {
    36             d2=cross(getvector(l[mid-1].a,dot),getvector(l[mid-1].b,dot));
    37             if(d2>=0)
    38                 return mid-1;
    39             else { high=mid-1;}
    40         }
    41 
    42         else  if(d1>=0)
    43         {
    44             d2=cross(getvector(l[mid+1].a,dot),getvector(l[mid+1].b,dot));
    45             if(d2<=0)
    46                 return mid;
    47             else {low=mid+1;}
    48         }
    49         
    50     }
    51     
    52 }
    53 
    54 int main()
    55 {
    56     int m,i,j,box[5010],mark;
    57     point corner1,corner2,dot;
    58 
    59     scanf("%d",&n);
    60     while(n!=0)
    61     {
    62         scanf("%d %d %d %d %d",&m,&corner1.x,&corner1.y,&corner2.x,&corner2.y);
    63         memset(box,0,sizeof(box[0])*(n+3));
    64         for(i=1;i<=n;i++)
    65         {
    66             scanf("%d %d",&l[i].a.x,&l[i].b.x);
    67             l[i].a.y=corner1.y;
    68             l[i].b.y=corner2.y;
    69         }
    70         l[0].a=corner1;
    71         l[0].b.x=corner1.x;
    72         l[0].b.y=corner2.y;
    73         l[n+1].a.x=corner2.x;
    74         l[n+1].a.y=corner1.y;
    75         l[n+1].b=corner2;
    76         for(i=0;i<m;i++)
    77         {
    78             scanf("%d %d",&dot.x,&dot.y);
    79             mark=judge(dot);
    80             box[mark]++;
    81 
    82 
    83 
    84         }
    85         for(i=0;i<=n;i++)
    86             printf("%d: %d\n",i,box[i]);
    87         scanf("%d",&n);
    88         if(n!=0)printf("\n");
    89         
    90 
    91 
    92     }
    93     return 0;
    94 }
    View Code
  • 相关阅读:
    Excutor线程池
    java-集合学习-底层实现
    java-接口—策略模式
    java开发技巧
    精进之道——为什么要问老师,不遮掩自己的弱点
    如何学习——为什么不想听课
    如何学习——如果差距过大怎么办
    Yii 之控制器响应
    Yii 之控制器创建使用
    PHP 之命名空间
  • 原文地址:https://www.cnblogs.com/leeshum/p/3110648.html
Copyright © 2020-2023  润新知