zoukankan      html  css  js  c++  java
  • poj1066(叉乘的简单应用)

    做完了才发现,好像没有人和我的做法一样的,不过我怎么都觉得我的做法还是挺容易想的。

    我的做法是:

    把周围的方框按顺时针编号,然后对于每一条边,如果点出现在边的一侧,则把另一侧所有的点加1,这样最后统计最小值+1即可。

    离散化一下 O(n)

    //
    //  main.cpp
    //  poj1066
    //
    //  Created by 陈加寿 on 15/12/30.
    //  Copyright (c) 2015年 chenhuan001. All rights reserved.
    //
    
    #include <iostream>
    #include <stdio.h>
    #include <string.h>
    #include <math.h>
    #include <algorithm>
    using namespace std;
    
    struct line
    {
        int x1,y1;
        int x2,y2;
    }g[33];
    
    int save[1010];
    
    int chg(int x,int y)
    {
        if( y==200 ) return x;
        if( x==200 ) return 200+200-y;
        if( y==0 ) return 400 + 200 -x;
        return 600+y;
    }
    
    int main(int argc, const char * argv[]) {
        int n;
        while( scanf("%d",&n)!=EOF )
        {
            for(int i=0;i<n;i++)
            {
                scanf("%d%d%d%d",&g[i].x1,&g[i].y1,&g[i].x2,&g[i].y2);
                g[i].x1 *= 2;
                g[i].y1 *= 2;
                g[i].x2 *= 2;
                g[i].y2 *= 2;
            }
            double x,y;
            scanf("%lf%lf",&x,&y);
            x*=2;
            y*=2;
            memset(save,0,sizeof(save));
            //以防万一,还是坐标乘2先
            int num=0;
            for(int i=0;i<n;i++)
            {
                if( chg( g[i].x1,g[i].y1 ) > chg(g[i].x2,g[i].y2) )
                {
                    swap(g[i].x1,g[i].x2);
                    swap(g[i].y1,g[i].y2);
                }
                
                int b,d;
                b= chg( g[i].x1,g[i].y1 );
                d= chg( g[i].x2,g[i].y2 );
                
                double p1x,p1y,p2x,p2y;
                p1x = g[i].x1-x;
                p1y = g[i].y1-y;
                p2x = g[i].x2-x;
                p2y = g[i].y2-y;
                
                if( p1x*p2y - p1y*p2x > 0 )
                {
                    num++;
                    for(int j=b+1;j<=d-1;j++) save[j]--;
                }
                else
                {
                    for(int j=b;j<=d;j++) save[j]++;
                }
            }
            int mi=10000;
            for(int i=0;i<800;i++) mi = min(mi ,save[i] );
            printf("Number of doors = %d
    ",mi+num+1);
        }
        return 0;
    }
  • 相关阅读:
    冒泡排序(可传函数参数)
    字符串转化成整数
    遍历文档内容,得到HTML层级结构
    跨域通信问题
    矩阵的快速幂
    CSS tricks
    牛客赛马网笔试攻略
    项目中遇到的问题
    Mysql远程链接访问权限设置
    恢复delete删除的数据
  • 原文地址:https://www.cnblogs.com/chenhuan001/p/5090489.html
Copyright © 2011-2022 走看看