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\n",mi+num+1);
    }
    return 0;
}

 

posted @ 2015-12-31 01:18  chenhuan001  阅读(336)  评论(0编辑  收藏  举报