`
yiheng
  • 浏览: 156559 次
社区版块
存档分类

POJ 1755 Triathlon(半平面交解不等式)

阅读更多

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

题目:铁人三项,每个人在某一项中有确定的速度,裁判可以决定某一项比赛的路程为多少,问对于某个人,是否存在一种安排能使他拿到第一,而且不能是并列。

我们假设三项的路程分别人X,Y,Z。

比较其中的两个人。A的时间为X / U1+Y / V1+Z / W1     B的时间为X / U2 +Y / V2 +Z / W2

如果A想要获胜妈,X / U1+Y / V1+Z / W1 - X / U2 +Y / V2 +Z / W2 < 0

由于我写的是顺时针的,所以把不等式变个号。这里一定要注意,小于0大于0和顺时针逆时针的对应关系

这个不等式还是有3个未知数。显然用三维就太麻烦了。由于我们最终不需要求出X,Y,Z具体为多少,而且Z>0,所以把不等式两边同时除以Z,则把X/Z看成一个未知量,Y/Z看成另外一个。

问题转化成一系列的不等式是否为解,而且注意条件X>0 Y>0

那么可以设立一个初始范围,(0,0)(0,inf)(inf,inf)(inf,0)

然后通过两个人的参数,求出AX+BY+C>0,通过半平面交解决,最终判断面积是否为0

有几个地方需要注意:

这题要求的精度很高,大家一味的说需要1e-16,其实不然,1e-8也过了。主要是中间的处理细节,对于1/U1-1/U2,普通的处理是需要两次除法,精度严重受损,可以改成(U2-U1)/(U1*U2)。

另外 就是特判,题目要求是不能并列,所以最终结果是大于0才行。而且如果遇到A==0&&B==0&&C<=0说明不等式无解,直接返回

#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 1<<28
#define zero(a) fabs(a)<eps
using namespace std;
struct Point{
    double x,y;
}p[1505],tp[1505],q[1505];
struct Node{
    double u,v,w;
}z[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);
}
Point Intersection(Point p1,Point p2,double a,double b,double c){
    double u=fabs(a*p1.x+b*p1.y+c);
    double v=fabs(a*p2.x+b*p2.y+c);
    Point t;
    t.x=(p1.x*v+p2.x*u)/(u+v);t.y=(p1.y*v+p2.y*u)/(u+v);
    return t;
}
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 -area/2.0;
}
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]=Intersection(p[i-1],p[i],a,b,c);
            if(a*p[i+1].x+b*p[i+1].y+c>eps)
                tp[++tmp]=Intersection(p[i],p[i+1],a,b,c);
        }
    }
    for(int i=1;i<=tmp;i++)
        p[i]=tp[i];
    p[0]=p[tmp];p[tmp+1]=p[1];
    cnt=tmp;
}
int slove(int n,int idx){
    p[1].x=0;p[1].y=0;
    p[2].x=0;p[2].y=inf;
    p[3].x=inf;p[3].y=inf;
    p[4].x=inf;p[4].y=0;
    p[0]=p[4];p[5]=p[1];
    int cnt=4;
    for(int i=0;i<n;i++){
        if(i==idx) continue;
        double a,b,c;
        a=(z[idx].u-z[i].u)/(z[idx].u*z[i].u);
        b=(z[idx].v-z[i].v)/(z[idx].v*z[i].v);
        c=(z[idx].w-z[i].w)/(z[idx].w*z[i].w);
        if(a==0&&b==0&&c<eps) return 0;
        Cut(a,b,c,p,cnt);
    }
    return !zero(Get_area(p,cnt));
}
int main(){
    int n;
    while( scanf("%d",&n)!=EOF){
        for(int i=0;i<n;i++)
            scanf("%lf%lf%lf",&z[i].u,&z[i].v,&z[i].w);
        for(int i=0;i<n;i++)
            puts(slove(n,i)?"Yes":"No");
    }
    return 0;
}



分享到:
评论

相关推荐

    poj2451半平面交

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

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

    在计算机科学领域,尤其是在算法竞赛中,掌握半平面交算法对于解决复杂的几何问题至关重要。本文将深入探讨半平面交算法,剖析其在ACM竞赛中的应用,并通过实例进一步说明其应用价值。 首先,我们要明确什么是半...

    半平面相关题解1

    本文将讨论半平面交及其在解决各种几何问题中的应用。 半平面交是指在二维平面上,由一组有向直线所定义的半平面(即直线一侧的区域)的交集。这个问题的关键在于确定这些半平面在特定区域内(例如题目中的正方形[0...

    破解poj

    破解poj

    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算法题目分类

    * 贪心:贪心算法是指通过选择当前最优的解来解决问题的方法,如 poj1328、poj2109、poj2586。 * 递归和分治法:递归和分治法是指将问题分解成多个小问题,通过解决小问题来解决大问题,如 poj3295。 * 递推:递推是...

    poj各种分类

    标题和描述中的“poj各种分类”主要指向的是在POJ(Peking University Online Judge)平台上,根据解题策略和算法类型对题目进行的分类。POJ作为一个知名的在线编程平台,提供了大量的算法练习题,适合从初学者到...

    poj题目分类

    * 递推法:通过逐步解决问题来获得最终解,例如 poj1068、poj2632、poj1573、poj2993、poj2996。 * 构造法:通过构造解来解决问题,例如 poj3295。 * 模拟法:通过模拟问题的过程来解决问题,例如 poj1068、poj...

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

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

    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训练计划.doc

    根据给定的文件信息,我们可以总结出一份详细的IT知识训练计划,主要针对编程竞赛和算法学习,特别是聚焦于POJ(Problem Online Judge)平台上的题目训练。这份计划分为两个阶段,初级阶段和中级阶段,共计涉及了165...

    POJ2002-Squares

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

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

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

    poj 3414解题报告

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

    POJ1837-Balance

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

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

    这些题目是针对ACM竞赛(ACM International Collegiate Programming Contest,简称ICPC)中的编程训练,POJ(Problem Set for Online Judges)是一个在线的编程竞赛平台,提供了许多算法和逻辑思维的练习题目。...

    poj 1012解题报告

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

    poj 2329解题报告

    poj 2329解题报告poj 2329解题报告poj 2329解题报告poj 2329解题报告

Global site tag (gtag.js) - Google Analytics