题目链接:哆啦A梦传送门

参考链接:https://blog.csdn.net/acm_cxlove/article/details/7883370

半平面交模板

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

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

A的时间为X / U1+Y / V1+Z / W1     B的时间为X / U2 +Y / V2 +Z / W2

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

,同理,b,c也一样求,因为我们不需要求出变量X,Y,Z的值,而且Z>0,所以把不等式两边同时除以Z,则把X/Z看成一个未知量,Y/Z看成另外一个。

注意下:A==0&&B==0&&C<=0说明不等式无解,直接返回。

还有精度问题:我是弄到1e-18才A的,1e-8,不行。

切割半平面时,还有一个细节,不是很懂,就是为什么要>-esp,而不是>=esp,以后再处理。

还注意一点的是:顺时针是大于0,逆时针是小于0,例如:(0,0),(1,2) 顺时针是 2*x-y=0,逆时针是 -2*x+y=0。

///点是顺时针存储的#include<cstdio>
#include<algorithm>
#include<cstring>
#include<cmath>using namespace std;const int maxn=1510;
#define INF 1<<28;struct point{double x,y;point(){}point(double _x,double _y){x=_x;y=_y;}
};struct node{double u,v,w;
};struct LINE{point s,t;LINE(){}LINE(point _s,point _t){s=_s;t=_t;}
};point operator + (point a,point b) { return point(a.x+b.x,a.y+b.y);}
point operator - (point a,point b) { return point(a.x-b.x,a.y-b.y);}
point operator * (point a,double p) { return point(a.x*p,a.y*p);}
point operator / (point a,double p) { return point(a.x/p,a.y/p);}const double esp=1e-18;
int dcmp(double x){if(fabs(x)<esp) return 0;else return x<0?-1:1;
}
bool operator < (const point &a,const point &b){return dcmp(a.x-b.x)<0||(dcmp(a.x-b.x)==0&&dcmp(a.y-b.y)<0);
}bool operator == (const point &a,const point &b){return dcmp(a.x-b.x)==0&&dcmp(a.y-b.y)==0;
}node poly[maxn]; ///记录最开始的多边形
point q[maxn];  ///临时保存新切割的多边形
point p[maxn];  ///保存新切割出的多边形int n,m;
double a,b,c;void getline(point P,point Q)///获取直线ax+by+c==0
{a=Q.y-P.y;b=P.x-Q.x;c=P.y*Q.x-P.x*Q.y;
}double Cross(point a,point b) { return a.x*b.y-a.y*b.x;}point Getlinenode(point p1,point p2) ///获取直线ax+by+c==0  和点p1和p2所连直线的交点
{double u=fabs(a*p1.x+b*p1.y+c);double v=fabs(a*p2.x+b*p2.y+c);point ans;ans.x=(p1.x*v+p2.x*u)/(u+v);ans.y=(p1.y*v+p2.y*u)/(u+v);return ans;
}void cut(point p[],int &cnt ) ///用直线ax+by+c==0切割多边形
{int tmp=0;for(int i=1;i<=cnt;i++){///题目是顺时钟给出点的,所以一个点在直线右边的话,那么带入值就会大于等于0if(a*p[i].x+b*p[i].y+c>-esp) ///这里>-esp,还不是很懂,为什么不是>=espq[++tmp]=p[i]; ///说明这个点还在切割后的多边形内,将其保留else{///该点不在多边形内,但是它和它相邻的点构成直线与ax+by+c==0所构成的交点可能在新切割出的多边形内,if(a*p[i-1].x+b*p[i-1].y+c>esp)///所以保留交点q[++tmp]=Getlinenode(p[i-1],p[i]);if(a*p[i+1].x+b*p[i+1].y+c>esp)q[++tmp]=Getlinenode(p[i+1],p[i]);}}for(int i=1;i<=tmp;i++)p[i]=q[i];p[0]=q[tmp];p[tmp+1]=q[1];cnt=tmp;
}int solve(int id)
{p[1].x=0;p[1].y=0; ///初始化平面p[2].x=0;p[2].y=INF;p[3].x=INF;p[2].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==id) continue;a=(poly[id].u-poly[i].u)/(poly[id].u*poly[i].u);b=(poly[id].v-poly[i].v)/(poly[id].v*poly[i].v);c=(poly[id].w-poly[i].w)/(poly[id].w*poly[i].w);///如果a=0,b=0,c<0,无解,返回0if(dcmp(a)==0&&dcmp(b)==0&&c<esp) return 0; ///判断小于0,要<esp,dcmp(c)<0,不能A,还未知
//        if(a==0&&b==0&&c<esp) return 0;cut(p,cnt); ///用直线ax+by+c==0切割多边形}double area=0;for(int i=2;i<cnt;i++) ///计算面积area+=Cross(p[i]-p[1],p[i+1]-p[1]);area=area/2.0;if(dcmp(area)==0) return 0; ///面积为0,说明无解,返回0else return 1;}int main()
{while(~scanf("%d",&n)){for(int i=0;i<n;i++)scanf("%lf%lf%lf",&poly[i].u,&poly[i].v,&poly[i].w);for(int i=0;i<n;i++){if(solve(i)) puts("Yes");else puts("No");}}return 0;
}
/*p[1].x=0.357143,p[1].y=0.035714
p[2].x=1.624650,p[2].y=1.176471
p[3].x=4.666667,p[3].y=0.466667
*/

poj 1755 Triathlon (半平面交解一元二次不等式)(切割求半平面交)相关推荐

  1. 3秒解一元二次不等式

    前言 这是我第一次在CSDN上发表文章,可能我学识尚浅,可能你会对我的文章内容的严谨性.准确性产生质疑.但我想说的是:我和你一样,满怀着对知识的热爱与渴求.在这里,我把自己闲暇时写的一些东西拿出来分享 ...

  2. POJ 1755 Triathlon(半平面交)

    题目链接:http://poj.org/problem?id=1755 题意:一段距离总长度为L,将L分成三部分a,b和c(a.b.c均大于0).有N(1 <= N <= 100) 个人, ...

  3. 一元二次不等式和一元三次不等式解法的思考

    说起一元二次不等式的解法真的不记得了,只是大概记得和一元二次方程的两个根有关系. (x+1)(x-3)<0 这个不等式的集解如果熟悉解法的同学可能一秒就知道答案了,-1<x<3 对于 ...

  4. c语言韦达定理求方程解,解一元二次方程练习题(韦达定理)

    <解一元二次方程练习题(韦达定理)>由会员分享,可在线阅读,更多相关<解一元二次方程练习题(韦达定理)(13页珍藏版)>请在人人文库网上搜索. 1.解一元二次方程练习题(配方法 ...

  5. 解一元线性同余方程组(详解+例题)

    问题描述:给出bi,ni的值,且n1, n2, n3,-, ni两两之间不一定互质,求Res的值? 解:采用的是合并方程的做法. 这里将以合并第一第二个方程为例进行说明 由上图前2个方程得(设k1.k ...

  6. 如何解一元一次方程视频_七年级数学教学视频-小邵课堂

    本套课程为七年级数学第三章专题教学,初中七年级学生在学完解一元一次方程之后,已掌握了书本上所总结的五个解题步骤,但在整个一元一次方程部分的习题和练习题中,还存着一些解题技巧,也就是说在解题中研究一元一 ...

  7. 如何解一元一次方程视频_初中数学一元二次方程,注重基础,实例解析考点

    暑假已经过去了一半了,对于即将上九年级的学生来说,这个暑假应该也是在学习中度过的吧,毕竟还有一年的时间就要中考了,中考是学生时代第一个比较重要的节点,更多的学生和家长也是为了能够进入重点高中,积极努力 ...

  8. Java黑皮书课后题第3章:*3.1(代数:解一元二次方程)可以使用下面的公式求一元二次方程ax2+bx+c=0,编写程序提示用户输入a b c的值,并显示基于判断式的结果

    *3.1(代数:解一元二次方程)可以使用下面的公式求一元二次方程ax2+bx+c=0,编写程序提示用户输入a b c的值,并显示基于判断式的结果 题目 题目描述 运行示例 破题 代码 题目 题目描述 ...

  9. 一元三次方程重根判别式_许兴华——关于复数集中解一元二次方程的问题

    在学习复数时,最近有个别比较好学的同学提出一个问题: "对于复数系数一元二次方程,是否可以用求根公式求解呢?" --回答是肯定的! 关于复数集中解一元二次方程的问题.其实,在复数集 ...

最新文章

  1. 每日一皮:地铁上打瞌睡的程序员...
  2. 【计算理论】可判定性 ( 丘奇-图灵论题 | 可判定性引入 | 图灵机语言 | 图灵机结果 | 判定机 | 部分函数与全部函数 | 可判定性定义 )
  3. 笔记:Zygote和SystemServer进程启动过程
  4. 实用c语言程序设计教材,实用C语言程序设计
  5. ImportError: libjpeg.so.62: cannot open shared object file: No such file or directory
  6. Failed to find any matching files for /tmp/resnet_v1_50.ckpt
  7. postgresql:解决in的效率问题
  8. oracle rman备份 归档模式,Oracle RMAN备份归档与非归档模式
  9. Python教学视频(二)输出语句的使用
  10. VMware:虚拟机(xp)与主机(win10)连接步骤(超详细)
  11. 第89章、系统服务之SMS服务(从零开始学Android)
  12. HyperLynx(二十六)电源完整性之AC去耦仿真实例(一)
  13. U盘文件无损进行格式转换
  14. 【DOTS学习笔记】DOTS简介
  15. 评估数据质量的指标总结1
  16. python对电商运营有帮助吗_建议收藏丨电商运营必备,跨境卖家都在用这个狠招!...
  17. 《信息化项目文档模板十三——研发项目申报书 》
  18. Hibernate二级缓存详解(转)
  19. 2021011206贾天乐实验五
  20. FTP工作原理及内网用端口映射方式建FTP的注意事项

热门文章

  1. 就这?阿里p6的面试竟然这么简单
  2. 计算机网络p2p应用,[计算机网络-应用层] P2P应用
  3. Pathon的安装过程
  4. 软件工程导论04-设计工程
  5. 亚马逊Dash永久下架:智能购物按钮究竟犯了什么错?
  6. youwuku和koudaitong以及weimeng差异
  7. 【自然语言处理】【向量表示】PairSupCon:用于句子表示的成对监督对比学习
  8. mac正常连wifi,无法解析域名
  9. php表格合并_合并表格怎么合并
  10. python 证件照换背景色(蓝底->白底,蓝底->红底)