这个题乍眼一看好像很简单,然后我就认为u、v、w只要有全部比另外一个人小的就不能win,否则就能win,但是这个思路只对了一半

不能win的结论是正确的,但是win的结论不止排除这一个条件

将这个人与其他人的条件列式

如果都win的话,则满足 x/v+y/u+(k-x-y)/w(i的)<x/v+y/u+(k-x-y)/w(j的)由此构成n条直线(半平面),然后求交,如果有交集,则输出Yes,否则No

#include <stdio.h>
#include <math.h>
#include <algorithm>
using namespace std;
const double eps = 1e-8; struct Point
{
double x,y;
Point(double x=0,double y=0):x(x),y(y) {}
}; typedef Point Vector; Vector operator - (Point A, Point B)
{
return Vector(A.x-B.x, A.y-B.y);
}
struct Line
{
Point p;
Vector v;
double ang;
Line() {}
Line(Point p,Vector v):p(p),v(v)
{
ang=atan2(v.y,v.x);
}
bool operator < (const Line& L) const
{
return ang<L.ang;
}
}; double Cross(Vector A, Vector B)
{
return A.x*B.y - A.y*B.x;
} bool Onleft(Line L, Point p)
{
return Cross(L.v, p-L.p)>0;
} Point GetIntersection(Line a, Line b)
{
Vector u = a.p-b.p;
double t = Cross(b.v, u)/Cross(a.v, b.v);
return Point(a.p.x+a.v.x*t, a.p.y+a.v.y*t);
} int BPMJ(Line *L, int n, Point *poly)
{
sort(L,L+n);
int first,last;
Point *p = new Point[n];
Line *q = new Line[n];
q[first=last=0] = L[0];
for(int i=1; i<n; i++)
{
while(first<last && !Onleft(L[i],p[last-1]))last--;
while(first<last && !Onleft(L[i],p[first]))first++;
q[++last] = L[i];
if(fabs(Cross(q[last].v,q[last-1].v))<eps)
{
last--;
if(Onleft(q[last], L[i].p))q[last] = L[i];
}
if(first<last) p[last-1] = GetIntersection(q[last-1], q[last]);
}
while(first<last && !Onleft(q[first], p[last-1])) last--;
if(last-first<=1)return 0;
p[last] = GetIntersection(q[last], q[first]);
int m = 0;
for(int i=first; i<=last; i++)
poly[m++] = p[i];
return m;
} double k=10000.0;
int u[110],v[110],w[110];
Point poly[110];
Line L[110]; int main()
{
int n;
while(scanf("%d",&n)==1)
{
for(int i=0; i<n; i++)
{
scanf("%d%d%d",&u[i],&v[i],&w[i]);
}
for(int i=0; i<n; i++)
{
int f=0;
for(int j=0; j<n; j++)
{
if(j!=i && u[i]<=u[j] && v[i]<=v[j] && w[i]<=w[j])
{
f=1;
break;
}
}
if(f==1)
printf("No\n");
else
{
Point p;
int ct=0;
for(int j=0; j<n; j++)
{
if(j!=i && u[i]>=u[j] && v[i]>=v[j] && w[i]>=w[j])
continue;
else if(j!=i)
{
double A=k/v[j]-k/v[i]-k/w[j]+k/w[i];
double B=k/u[j]-k/u[i]-k/w[j]+k/w[i];
double C=k/w[j]-k/w[i];
if(fabs(A)>fabs(B))
p=Point(-C/A,0);
else
p=Point(0,-C/B);
Vector v(B,-A);
L[ct++] = Line(p,v);
}
}
L[ct++] = Line(Point(0,0), Vector(0,-1));
L[ct++] = Line(Point(0,0), Vector(1,0));
L[ct++] = Line(Point(0,1), Vector(-1,1));
if(BPMJ(L,ct,poly))printf("Yes\n");
else printf("No\n");
}
}
}
return 0;
}

URAL 1062 - Triathlon(半平面交)的更多相关文章

  1. POJ 1755 Triathlon [半平面交 线性规划]

    Triathlon Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 6912   Accepted: 1790 Descrip ...

  2. LA 2218 Triathlon(半平面交)

    Triathlon [题目链接]Triathlon [题目类型]半平面交 &题解: 做了2道了,感觉好像套路,都是二分答案,判断半平面交是否为空. 还有刘汝佳的代码总是写const +& ...

  3. LA2218 Triathlon /// 半平面交 oj22648

    题目大意: 铁人三项分连续三段:游泳 自行车 赛跑 已知各选手在每个单项中的速度v[i],u[i],w[i] 设计每个单项的长度 可以让某个特定的选手获胜 判断哪些选手有可能获得冠军 输出n行 有可能 ...

  4. POJ 1755 Triathlon (半平面交)

    Triathlon Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 4733   Accepted: 1166 Descrip ...

  5. POJ 1755 Triathlon(线性规划の半平面交)

    Description Triathlon is an athletic contest consisting of three consecutive sections that should be ...

  6. LA 2218 (半平面交) Triathlon

    题意: 有n个选手,铁人三项有连续的三段,对于每段场地选手i分别以vi, ui 和 wi匀速通过. 对于每个选手,问能否通过调整每种赛道的长度使得他成为冠军(不能并列). 分析: 粗一看,这不像一道计 ...

  7. poj 1755 半平面交+不等式

    Triathlon Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 6461   Accepted: 1643 Descrip ...

  8. 【POJ 3525】Most Distant Point from the Sea(直线平移、半平面交)

    按逆时针顺序给出n个点,求它们组成的多边形的最大内切圆半径. 二分这个半径,将所有直线向多边形中心平移r距离,如果半平面交不存在那么r大了,否则r小了. 平移直线就是对于向量ab,因为是逆时针的,向中 ...

  9. 【BZOJ-2618】凸多边形 计算几何 + 半平面交 + 增量法 + 三角剖分

    2618: [Cqoi2006]凸多边形 Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 959  Solved: 489[Submit][Status] ...

随机推荐

  1. Python之简单的SMTP发送邮件详细教程附代码

      简介 Python发送邮件的教程本人在网站搜索的时候搜索出来了一大堆,但是都是说了一大堆原理然后就推出了实现代码,我测试用给出的代码进行发送邮件时都不成功,后面找了很久才找到原因,这都是没有一个详 ...

  2. Amazon's NoSQL Journey and AWS Operations

    AWS: Amazon Web Services 提供了一整套基础设施和应用程序服务,使您几乎能够在云中运行一切应用程序:从企业应用程序和大数据项目,到社交游戏和移动应用程序. 计算类: EC2:弹性 ...

  3. secureCRT使用小贴士

    (一)使用WIN键盘 在securecrt界面:工具→键映射编辑器,在弹出的键盘中点击“home”,会弹出一个窗口,在“发送字符串”中输入:\033[1~ 另存为securecrt安装根目录下的Key ...

  4. 树莓派连接GPS模块

    一月份的时候觉得好玩买了树莓派,但是太懒没怎么研究,但最近当初买树莓派时的那个梦想又萦绕心头,决定抽空完成一下当年的计划~ GPS模块是其中很重要的一环,于是在某宝上搜索,找了一家相对便宜也很轻巧的G ...

  5. 【产品对比分析】See做了明星衣橱想做的东西?

    不断地发现.联想.思考,让学到的东西互通起来吧!  先来两张See的界面图镇楼——          See简介: See是一个专注找同款的时尚社区,主打功能是一键拍照找同款,由社区为你提供最佳商品或 ...

  6. 使用lombok

    Lombok是一种JavaArchive(JAR)文件,可用来消除Java代码的冗长.通过在开发环境中实现Lombok,开发人 员可以节省构建诸如hashCode()和equals()这样的方法以及以 ...

  7. log4j_slf4j log4j.properties

    hibernate 使用的日志是slf4j,而 slf4j又有各种实现策略. 使用log4j 就是其中一种方式. 需要的jar 包: log4j-1.2.16.jar slf4j-api-1.6.1. ...

  8. Storm on Yarn 安装配置

    1.背景知识 在不修改Storm任何源代码的情况下,让Storm运行在YARN上,最简单的实现方法是将Storm的各个服务组件(包括Nimbus和Supervisor),作为单独的任务运行在YARN上 ...

  9. Android 中的MVC与数据流动

    今天看了一个Android的Training生命周期转换的例子,顿觉得他的设计非常巧妙,我的分析如下: 1.在com.example.android.lifecycle包中有: 3个正常的全屏acti ...

  10. C++ 1

    1 new 建立一个堆对象 new 类名(初值列表) 返回一个指针 int * p=new int(3)动态分配 2 delete  释放指针 delete p; delete [] p ;释放动态申 ...