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; }