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;
}
时间: 2024-10-27 04:27:36

poj1066(叉乘的简单应用)的相关文章

优先队列之二叉堆与d-堆

二叉堆简介 平时所说的堆,若没加任何修饰,一般就是指二叉堆.同二叉树一样,堆也有两个性质,即结构性和堆序性.正如AVL树一样,对堆的以此操作可能破坏者两个性质中的一个,因此,堆的操作必须要到堆的所有性质都被满足时才能终止. 结构性质 堆是一棵完全填满的二叉树,因为完全二叉树很有规律,所以它可以用一个数组表示而不需要指针.如下图所示,图2中的数组对应图1中的堆.                   图1:二叉堆                                            

优先队列 - 数据结构 (二叉堆)

优先队列包括二叉堆.d-堆.左式堆.斜堆.二项队列等 1.二叉堆 堆是一棵被完全填满的二叉树,有可能例外的是在底层,底层上的元素从左到右填入.这样的树称为完全二叉树. 堆序的性质:在一个堆中,对于每一个节点X,X的父亲的关键字小于(或等于)X中的关键字,根节点除外(它没有父节点).完全二叉树可以用数组实现. //关于二叉堆的头文件定义 如果要插入的元素是新的最小值,那么它将一直被推向堆顶.这样在某一个时刻,i将是1,我们就需要另Insert函数令程序跳出while循环,这个值必须保证小于或者至少

数据结构之二叉搜索树

C语言实现二叉搜索树很简单,权当复习下指针知识//// Created by SuperHakce on 2018/3/29.// #ifndef BINARYSEARCHTREE_BINARYTREE_H #define BINARYSEARCHTREE_BINARYTREE_H typedef struct BinaryTreeNode{ int key; struct BinaryTreeNode *leftChild; struct BinaryTreeNode *rightChild;

线段树(一)

问题: 先抛出一个问题,坐标轴上有若干线段,现在给定若干个点,对于每个点,求出包含点的线段的数量 如果用常规的解法,时间复杂度是O(mn),空间复杂度是O(m + n) 能不能降低一下时间复杂度呢?答案是肯定的,这些线段里有大量相交或者覆盖的线段,而上面的解法显然没有利用这些信息,导致时间复杂度较高,现在我们引入 一个数据结构,线段树(Segment Tree),从Wikipedia抄过来定义如下: In computer science, a segment tree is a tree da

数据结构 d-堆

d-堆 二叉堆因为实现简单,因此在需要优先队列的时候几乎总是使用二叉堆.d-堆是二叉堆的简单推广,它恰像一个二叉堆,只是所有的节点都有d个儿子(因此,二叉堆又叫2-堆).下图表示的是一个3-堆.注意,d-堆要比二叉堆浅得多,它将Insert操作的运行时间改进为.然而,对于大的d,DeleteMin操作费时得多,因为虽然树浅了,但是d个儿子中的最小者是必须找到的,如果使用标准算法,将使用d-1次比较,于是将此操作的时间提高到 .如果d是常数,那么当然两种操作的运行时间都为 O(logN).虽然仍可

Android事件传递机制详解及最新源码分析——ViewGroup篇

在上一篇<Android事件传递机制详解及最新源码分析--View篇>中,详细讲解了View事件的传递机制,没掌握或者掌握不扎实的小伙伴,强烈建议先阅读上一篇. 好了,废话还是少说,直奔主题,开始本篇的ViewGroup事件传递机制探索之旅. 依然从简单的Demo例子现象开始分析 新建安卓工程,首先自定义一个Button以及一个RelativeLayout,很简单,只是重写了主要与事件传递机制相关的方法,代码如下: 自定义WLButton类: 1 public class WLButton e

深入浅出数据结构C语言版(15)——优先队列(堆)

在普通队列中,元素出队的顺序是由元素入队时间决定的,也就是谁先入队,谁先出队.但是有时候我们希望有这样的一个队列:谁先入队不重要,重要的是谁的"优先级高",优先级越高越先出队.这样的数据结构我们称之为优先队列(priority queue),其常用于一些特殊应用,比如操作系统控制进程的调度程序. 那么,优先队列该如何实现呢?我们可以很快给出三种解决方案. 1.使用链表,插入操作选择直接插入到表头,时间复杂度为O(1),出队操作则遍历整个表,找到优先级最高者,返回并删除该结点,时间复杂度

luvit 初尝鲜

官网:http://luvit.io/ Luvit is an attempt to do something crazy by taking node.js' awesome architecture and dependencies and seeing how it fits in the Lua language. This project is still under heavy development, but it's showing promise. In initial ben

平衡二叉树【代码】

平衡二叉树第一次是在大一下学期的数据结构上学的,记得当时自己看书上的算法描述,感觉云里雾里,各种旋转,总有种似懂非懂的样子,无奈当时的数据结构也就是那样似懂非懂地学过去了.时隔两年,转眼就大三下学期了,当我现在再次在<算法导论>上看红黑树遇到这个词的时候,不免感慨当时自己学数据结构时敲的代码实在是太少了,很多东西都没弄懂,现在才清楚地知道,要想把一个算法,一种数据结构彻底弄懂,就必须去把相应的代码落实下来,这也是给后人的一个教训呀. 闲话不多说了,在说平衡二叉树之前,我先简单地介绍一些二叉搜索