POJ 1755 Triathlon 半平面交

2021-06-18 23:15:18 字數 2293 閱讀 4994

看的這裡:

題意:鐵人三項比賽,給出n個人進行每一項的速度vi, ui, wi;  對每個人判斷,通過改變3項比賽的路程,是否能讓該人獲勝(嚴格獲勝)。

思路:題目實際上是給出了n個式子方程,ti  = ai * x + bi * y + ci * z , 0 < i < n

要判斷第i個人能否獲勝,即判斷不等式組   tj - ti > 0,      0 < j < n && j != i    有解

即 (aj - ai)* x + (bj - bi) * y + ( cj - ci ) * z > 0,   0 < j < n && j != i 有解

由於 z > 0, 所以 可以兩邊同時除以 z, 將 x / z, y / z 分別看成 x和 y , 這樣就化三維為二維,可用半平面交判斷是否存在解了,

對每個人構造一次,求一次半平面交即可。

關鍵是根據這個斜率式子怎麼搞成向量的。需要想一想。

然後注意的是半平面交出來是單獨乙個點是不行的。

因為題目要求的是嚴格勝出

#include #include #include #include #include #include #include #include #include #include #include #define maxn 111111

#define maxm 211111

#define pi acos(-1.0)

#define eps 1e-8

#define inf 1e10

using namespace std;

int dblcmp(double d)

struct point

point(double _x, double _y):

x(_x), y(_y){};

void input()

double dot(point p)

double distance(point p)

point sub(point p)

double det(point p)

bool operator == (point a)const

bool operator < (point a)const

}p[maxn];

struct line

line(point _a,point _b)

bool parallel(line v)

point crosspoint(line v)

bool operator == (line v)const

};struct halfplane:public line

//表示向量 a->b逆時針(左側)的半平面

halfplane(point _a, point _b)

halfplane(line v)

void calcangle()

bool operator <(const halfplane &b)const };

struct polygon

}void getarea()

area = fabs(area) / 2;

}}convex;

bool judge(point a, point b, point o)

struct halfplanes

void unique()

n = m;

} bool halfplaneinsert()

while (st < ed && judge(hp[que[st]].b, p[ed], hp[que[st]].a)) ed--;

while (st < ed && judge(hp[que[ed]].b, p[st + 1], hp[que[ed]].a)) st++;

if (st + 1 >= ed)return false;

return true;

} void getconvex(polygon &con) }

}h;int a[maxn], b[maxn], c[maxn];

int n;

int main()

continue;

}xa = 0, xb = d2;

ya = yb = -c / b;

}else

else

}h.push(halfplane(point(xa, ya), point(xb, yb)));

}if(flag || !h.halfplaneinsert() ) puts("no");

else puts("yes");

}return 0;

}

poj 1755 Triathlon 半平面交

給出n個人,還有他們在鐵人三項中游泳 自行車和賽跑的速度,問通過合理設計三個比賽的長度,哪些人可能成為冠軍 不能是並列的 設行程總長度為1,其中游泳的長度為x,自行車的長度為y,則賽跑的長度為1 x y,若i可能成為冠軍,則令f i xv i yu i 1 x yw i 有f i j j i 之後就...

POJ 1755 Triathlon(半平面交)

題意 一段距離總長度為l,將l分成三部分a,b和c a b c均大於0 有n 1 n 100 個人,第i個人在這三段中的速度分別是vi,ui和wi 1 vi,ui,wi 10000 問是否存在一種分法,使得第i個人可以成為冠軍 並列冠軍不算,也就是只有i乙個人是冠軍 思路 對於某種分法,第i個人用的...

LA2218 Triathlon 半平面交

首先三項比賽 二維空間 設全長為1 然後對v,u,w全大的,沒有要求,全小的,直接不可能。然後對應最多n 1 3個平面的半平面交。有對應區域的就有解 注意兩點1 ax by c 0 對應的line的v就是 b,a 2 可以適當擴大k 使得數值精確一些 保險起見 include include inc...