看的這裡:
題意:鐵人三項比賽,給出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...