• POJ2398+几何+排序


    题意:

    给定一些线段的两端和一些点。

    问某些区域出现的点的个数的次数。。。

    题目给定的线段未排序!!!

    View Code
     1 /*
     2 几何+排序
     3 */
     4 #include<stdio.h>
     5 #include<string.h>
     6 #include<stdlib.h>
     7 #include<algorithm>
     8 #include<iostream>
     9 using namespace std;
    10 const int maxn = 1005;
    11 const double eps = 1e-8;
    12 struct point {
    13     double x,y;
    14 };
    15 struct Line {
    16     point u,d;
    17 }line[ maxn ];
    18 int cnt[ maxn ],vis[ maxn ];
    19 double xmult( point sp,point ep,point op ){
    20     return ( sp.x-op.x )*( ep.y-op.y )-( sp.y-op.y )*( ep.x-op.x );
    21 }
    22 int cmp( Line a,Line b ){
    23     return ( a.u.x+a.d.x )<( b.u.x+b.d.x );
    24 }
    25 int main(){
    26     int n,m;
    27     double x1,x2,y1,y2;
    28     while( scanf("%d",&n),n ){
    29         scanf("%d%lf%lf%lf%lf",&m,&x1,&y1,&x2,&y2);
    30         line[ 0 ].u.x = x1,line[ 0 ].u.y = y1;
    31         line[ 0 ].d.x = x1,line[ 0 ].d.y = y2;
    32         for( int i=1;i<=n;i++ ){
    33             scanf("%lf%lf",&line[ i ].u.x,&line[ i ].d.x);
    34             line[ i ].u.y = y1;
    35             line[ i ].d.y = y2;
    36         }
    37         sort( line+1,line+n+1,cmp );
    38         line[ n+1 ].u.x = x2,line[ n+1 ].u.y = y1;
    39         line[ n+1 ].d.x = x2,line[ n+1 ].d.y = y2;
    40         memset( cnt,0,sizeof( cnt ) );
    41         memset( vis,0,sizeof( vis ) );
    42         for( int num=0;num<m;num++ ){
    43             point toy;
    44             scanf("%lf%lf",&toy.x,&toy.y);
    45             for( int j=0;j<=n;j++ ){
    46                 if( xmult( toy,line[ j ].d,line[ j ].u )<-eps&&xmult( toy,line[ j+1 ].d,line[ j+1 ].u )>eps ){
    47                     cnt[ j ]++;
    48                 }
    49             }
    50         }
    51         for( int i=0;i<=n;i++ ){
    52             if( cnt[ i ]!=0 )
    53                 vis[ cnt[i] ]++;
    54         }
    55         printf("Box\n");
    56         for( int i=1;i<maxn;i++ ){
    57             if( vis[ i ]!=0 )
    58                 printf("%d: %d\n",i,vis[ i ]);
    59         }
    60     }
    61     return 0;
    62 }
    keep moving...
  • 相关阅读:
    python中open函数的使用
    内存地址转换与分段【转】
    VirtualBox虚拟机网络设置【转】
    Google免费的公共DNS服务器
    SSH数据交互过程【转】
    适合Web服务器的iptables规则【转】
    使用安装光盘建立本地yum仓库【转】
    RHCE从入门到精通视频教程【转】
    解决Apache启动时错误提示
    50个C/C++源代码网站【转】
  • 原文地址:https://www.cnblogs.com/xxx0624/p/2983286.html
Copyright © 2020-2023  润新知