POJ 1755 Triathlon 半平面交
2012-05-12 12:26
507 查看
题意
题意:在铁人三项比赛中,给出每个人游泳,骑车,跑步的速度,你可以任意安排游泳,骑车,跑步的路程(路程非0),若某人可以获得第一(严格),则输出Yes,否则No思路
将三个路程其中一个设为1,剩下两个是x,y.对于每个人i,列出方程Ai*x+Bi*y+Ci<Aj*x+Bj*x+Cj。求半平面交,若解集为空,No。否则Yes。
代码
#include <iostream> #include <cmath> #include <cstring> #include <vector> #include <cstdio> using namespace std; #define INF 12345678 #define EPS 1e-8 #define NMAX 110 struct point { double x,y; bool mark; point(){} point(double x0,double y0):x(x0),y(y0),mark(1){} }; vector<point> p; int n; double a[NMAX],b[NMAX],c[NMAX]; point operator -(const point &A,const point &B) { return point(A.x-B.x,A.y-B.y); } double cross(point p1,point p2) { return p1.x*p2.y-p1.y*p2.x; } int dblcmp(double x) { if(fabs(x)<EPS) return 0; return (x>0) ? 1:-1; } point find_intersection(point p1,point p2,point p3,point p4) { double s1=cross(p2-p1,p3-p1); double s2=cross(p4-p1,p2-p1); return point((p3.x*s2+p4.x*s1)/(s1+s2),(p3.y*s2+p4.y*s1)/(s1+s2)); } void update(double A,double B,double C) { point t; for (int i=0;i<p.size();i++) if (dblcmp(A*p[i].x+B*p[i].y+C) >0) p[i].mark=1; else p[i].mark=0; p.push_back(p[0]); for (int i=0;i<p.size()-1;i++) { if (p[i].mark ^ p[i+1].mark==1) { if (A!=0) t=find_intersection(point(-C/A,0),point(-(C+B)/A,1),p[i],p[i+1]); else if(B!=0) t=find_intersection(point(0,-C/B),point(1,-C/B),p[i],p[i+1]); p.insert(p.begin()+i+1,t); i++; } } p.pop_back(); for(int i=0;i<p.size();i++) if(!p[i].mark) p.erase(p.begin()+i), i--; } bool solve(int v) { p.clear(); p.push_back(point(INF,INF)); p.push_back(point(INF,0)); p.push_back(point(0,0)); p.push_back(point(0,INF)); for (int i=0;i<n;i++) if (i!=v) { update(1/a[i]-1/a[v],1/b[i]-1/b[v],1/c[i]-1/c[v]); if(p.size()==0) return 0; } return 1; } int main() { scanf("%d",&n); for (int i=0;i<n;i++) scanf("%lf%lf%lf",a+i,b+i,c+i); for (int i=0;i<n;i++) if (solve(i)) printf("Yes\n"); else printf("No\n"); return 0; }
链接:http://poj.org/problem?id=1755
相关文章推荐
- [POJ][1755][Triathlon][半平面交]
- POJ 1755 Triathlon 半平面交
- POJ 1755 Triathlon 半平面交
- POJ 1755 Triathlon 半平面交
- poj 1755 Triathlon 半平面交判断不等式是否有解
- POJ 1755 Triathlon(线性规划の半平面交)
- POJ 1755-Triathlon(半平面交-铁人三项)
- 【半平面交】 POJ 1755 Triathlon
- poj 1755 Triathlon 半平面交
- POJ 1755 Triathlon(n^2 半平面交, 两点式和参数式直线求交点)
- Poj 1755 Triathlon (半平面交求可行域)
- POJ 1755 Triathlon(半平面交解不等式)
- POJ 1755 Triathlon(半平面交)
- BZOJ 3800 Saber VS Lancer/POJ 1755 Triathlon 半平面交
- POJ 1755 Triathlon [半平面交 线性规划]
- poj 1755 Triathlon(半平面交解可行域)
- POJ 1755 Triathlon【半平面交】
- poj 1755 Triathlon (半平面交求解不等式组)
- POJ 1755 Triathlon (半平面交)
- poj 1755 Triathlon(半平面交解不等式)