`
java-mans
  • 浏览: 11814180 次
文章分类
社区版块
存档分类
最新评论

POJ 2540 Hotter Colder(半平面交求可行域)

 
阅读更多

转载请注明出处,谢谢http://blog.csdn.net/acm_cxlove/article/details/7854526 by---cxlove

题目:从0,0出发,走到某一点,会告诉你目标点是更近了还是更远了,每走一步求出目标的可能范围区域面积

http://poj.org/problem?id=2540

给出两点,已知哪点更近,也就是将区域用中垂线分开,便可以确定解在哪个区域范围之内

首先是根据两个点要求出中垂线的方程,自己YY吧,不过我的做法可能比较传统,然后还需要考虑斜率不存在的情况。

有了方程,还要注意不等式的正负,也就是区域的方向。

不断地加上新的半平面,切割原有的凸多边形。

注意:出现same的话,说明目标在中垂线上,而题目要求的是面积,所以答案为0.而且之后的所有输出都应该为0.

当之前出现了面积为0的情况,说明之前一组就已经找不到可行区域了,之后的所有答案也应为0

POJ,ZOJ,FZU都有这题,数据也有些不同,可以都尝试一下。

#include<iostream>
#include<fstream>
#include<iomanip>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<cmath>
#include<set>
#include<map>
#include<queue>
#include<stack>
#include<string>
#include<vector>
#include<sstream>
#include<cassert>
#define LL long long
#define eps 1e-8
#define inf 10000
#define zero(a) fabs(a)<eps
#define N 20005
using namespace std;
struct Point{
    double x,y;
    Point(){}
    Point(double tx,double ty){x=tx;y=ty;}
}pre,cur,p[105],tp[105];
double xmul(Point p0,Point p1,Point p2){
    return (p1.x-p0.x)*(p2.y-p0.y)-(p1.y-p0.y)*(p2.x-p0.x);
}
//给出两点,算出中垂线的标准方程
void Get_midperpendicular(Point p1,Point p2,double &a,double &b,double &c){
    //中垂线斜率为0
    if(zero(p1.x-p2.x)) a=0,b=1;
    //中垂线斜率不存在
    else if(zero(p1.y-p2.y)) a=1,b=0;
    //一般情况
    else b=p2.y-p1.y,a=p2.x-p1.x;
    c=-a*(p2.x+p1.x)/2-b*(p2.y+p1.y)/2;
}
Point Get_Intersection(Point p1,Point p2,double a,double b,double c){
    double u=fabs(a*p1.x+b*p1.y+c),v=fabs(a*p2.x+b*p2.y+c);
    return Point((p1.x*v+p2.x*u)/(u+v),(p1.y*v+p2.y*u)/(u+v));
}
void Cut(double a,double b,double c,Point p[],int &cnt){
    int tmp=0;
    for(int i=1;i<=cnt;i++){
        if(a*p[i].x+b*p[i].y+c>-eps) tp[++tmp]=p[i];
        else{
            if(a*p[i-1].x+b*p[i-1].y+c>eps)
                tp[++tmp]=Get_Intersection(p[i-1],p[i],a,b,c);
            if(a*p[i+1].x+b*p[i+1].y+c>eps)
                tp[++tmp]=Get_Intersection(p[i+1],p[i],a,b,c);
        }
    }
    for(int i=1;i<=tmp;i++)
        p[i]=tp[i];
    p[0]=tp[tmp];p[tmp+1]=p[1];
    cnt=tmp;
}
double Get_Area(Point p[],int n){
    double area=0;
    for(int i=2;i<n;i++)
        area+=xmul(p[1],p[i],p[i+1]);
    return fabs(area)/2.0;
}
int main(){
    pre.x=pre.y=0;
    char str[10];
    p[1].x=0;p[1].y=0;
    p[2].x=0;p[2].y=10;
    p[3].x=10;p[3].y=10;
    p[4].x=10;p[4].y=0;
    p[0]=p[4];p[5]=p[1];
    int cnt=4;
    double area=1.0;
    while(scanf("%lf%lf%s",&cur.x,&cur.y,str)!=EOF){
        double a,b,c;
        Get_midperpendicular(pre,cur,a,b,c);
        //确定不等式,使得区域范围为ax+by+c>0
        if(strcmp(str,"Colder")==0){
            if(a*pre.x+b*pre.y+c<-eps){a=-a;b=-b;c=-c;}
        }
        else if(strcmp(str,"Hotter")==0){
            if(a*cur.x+b*cur.y+c<-eps){a=-a;b=-b;c=-c;}
        }
        else
            area=0;
        //如果出现了same或者之前面积为0,之后都为0
        if(zero(area)){
            printf("0.00\n");
            continue;
        }
        Cut(a,b,c,p,cnt);
        area=Get_Area(p,cnt);
        printf("%.2f\n",area);
        pre=cur;
    }
    return 0;
}


分享到:
评论

相关推荐

    poj2451半平面交

    计算几何半平面交,poj2451 一题是模版题,这里的代码可以作为模版使用,速度比较快

    acm之半平面交,很少有的好资源

    例如,在“Hotter and Colder”游戏中,可以通过半平面来缩小目标位置的可能性范围,而每次根据A对B的位置反馈,更新半平面的交集,从而逐步接近目标。另一个实际例子是“Nice Milk”问题,在这个问题中,选手需要...

    半平面相关题解1

    可以通过将多边形的边转化为半平面,再求半平面的交来找到核。如果交集中的点数少于3,说明多边形无核,反之则有核。 POJ3130和POJ3335类似,都是判断多边形是否有核。星形多边形的定义是存在一个点能看到多边形...

    poj题目分类

    3. 多边型的简单算法(求面积)和相关判定(点在多边型内,多边型是否相交):例如 poj1408、poj1584。 4. 凸包:例如 poj2187、poj1113。 这些知识点涵盖了算法、数据结构、数学、计算几何学等领域的多个方面,为...

    ACM-POJ 算法训练指南

    2. **线段交**:计算线段是否相交及交点位置(poj3176, poj1080, poj1159)。 ### 七、概率统计 1. **概率计算**:计算随机事件的概率(POJ3252, poj1850, poj1019, poj1942)。 2. **期望值**:计算期望值问题...

    POJ.rar_poj java_poj1048

    【标题】"POJ.rar_poj java_poj1048" 涉及的知识点主要围绕编程竞赛中的“约瑟夫环”问题,这里是一个加强版,使用Java语言进行解决。 【描述】"POJ1048,加强版的约瑟夫问题 难度中等" 提示我们,这个问题是编程...

    poj训练计划.doc

    - 最优化剪枝和可行性剪枝:如`poj3411, poj1724`。 - **动态规划** - 复杂的动态规划:如`poj1191, poj1054`。 - 记录状态的动态规划:如`poj3254, poj2411`。 这份训练计划不仅涵盖了基础的算法和数据结构,...

    POJ算法题目分类

    * 图的深度优先遍历和广度优先遍历:图的深度优先遍历和广度优先遍历是指遍历图的两种方式,如 poj1860、poj3259、poj1062、poj2253、poj1125、poj2240。 * 最短路径算法:最短路径算法是指计算图中两点之间的最短...

    POJ入门题库(含解题思路和答案)

    17. POJ——2707 求一元二次方程的根:涉及到基础的代数知识,如使用求根公式解决一元二次方程。 18. POJ——2714 求平均年龄:可能需要处理年龄数据并计算平均值,涉及到数据处理和统计计算。 19. POJ——2715 谁...

    poj各种分类

    包括求多边形面积、点在多边形内等判定,如poj1408和poj1584。 #### 凸包 寻找凸多边形的边界,用于图形分析和碰撞检测,如poj2187和poj1113。 ### 中级阶段的扩展 在初级阶段的基础上,中级阶段涵盖了更多复杂的...

    jihe.rar_2289_POJ 3714_poj3714_poj3714 Ra_visual c

    标题中的"jihe.rar_2289_POJ 3714_poj3714_poj3714 Ra_visual c" 提到了一个压缩文件,可能包含有关编程竞赛或算法解决的资源,特别是与POJ(Problem On Judge)平台上的问题3714相关的。"Ra_visual c"可能指的是...

    POJ1159-Palindrome

    【标题】"POJ1159-Palindrome" 是北京大学在线编程平台POJ上的一道编程题目。这道题目主要考察的是字符串处理和回文判断的知识点。 【描述】"北大POJ1159-Palindrome 解题报告+AC代码" 暗示了解决这道问题的方法和...

    POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类POJ分类

    - **例题**:poj1860, poj3259, poj1062, poj2253, poj1125, poj2240 - **解释**:最短路径算法包括Dijkstra算法、Bellman-Ford算法、Floyd算法以及堆优化的Dijkstra算法等。 ##### (3) 最小生成树算法 - **例题**...

    POJ2002-Squares

    【标题】"POJ2002-Squares"是一个经典的计算机编程题目,源自北京大学的在线判题系统(POJ,即PKU Online Judge)。这个题目主要涉及到算法设计和实现,尤其是数学和动态规划方面的知识。 【描述】"解题报告+AC代码...

    POJ1201-Intervals

    代码中可能会用到动态规划、贪心算法等策略,以求在满足题目要求的同时,保证算法的时间复杂度尽可能低,从而在POJ平台上获得AC状态。而解题报告则会详细解释这些算法的应用和选择原因,以及代码的具体实现细节。

    POJ3253-POJ3253-Fence Repair【STL优先队列】

    标题“POJ3253-POJ3253-Fence Repair【STL优先队列】”指的是一个在线编程竞赛题目,源自北京大学的在线判题系统POJ(Problem Online Judge)。该题目要求参赛者使用C++编程语言解决特定的问题,并且在解决方案中...

    POJ1804-Brainman【借助Mergesort求逆序数O(nlogn)】

    在编程竞赛中,题目"POJ1804 - Brainman"是一道要求高效解决逆序对问题的算法题。本题目的核心是利用归并排序(Mergesort)算法来实现逆序数的计算,以达到O(n log n)的时间复杂度,避免平方级别的效率消耗。 首先...

    poj 3414解题报告

    poj 3414解题报告poj 3414解题报告poj 3414解题报告poj 3414解题报告

    POJ1837-Balance

    【标题】"POJ1837-Balance"是一个在线编程竞赛题目,源自著名的编程练习平台POJ(Programming Online Judge)。这个题目旨在测试参赛者的算法设计和实现能力,特别是处理平衡问题的技巧。 【描述】"解题报告+AC代码...

    poj 1012解题报告

    poj 1012解题报告poj 1012解题报告poj 1012解题报告poj 1012解题报告

Global site tag (gtag.js) - Google Analytics