POJ 1755 Triathlon(半平面交)

2021-09-07 23:09:37 字數 2046 閱讀 6302

題意:一段距離總長度為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個人用的時間ti=a/vi+b/ui+c/wi,第j個人用的時間tj=a/vj+b/uj+c/wj,那麼本題的要求就是對於i(1<=i<=n),是否有可能對於所有的j(1<=j<=n 且j!=i),滿足ti-tj<0?即(1/vi-1/vj)*a+(1/ui-1/uj)*b+(1/wi-1/wj)*c<0 。兩邊同時除以c得(令x=a/c,y=b/c,a=1/vi-1/vj,b=1/ui-1/uj,c=1/wi-1/wj):a*x+b*y+c<0。到此,可以看出,就是乙個半平面求交的問題。然後每個人用其他人交一下,求出最後的面積,大於0即可。我們注意到x=a/c>=0,y=b/c>=0(其實嚴格按照題意來說是大於0),x+y=(a+b)/c=(l-c)/c=l/c-1,因此初始化時必然是一頂點在原點且在第一象限的等腰三角形。至於這個等腰三角形的兩個腰長是多少為保險起見建議定的大一點,我是定的100000。

int db(double x)

struct point

point(double _x,double _y)

void read()

void output()

point operator+(point a)

point operator-(point a)

double operator*(point a)

point operator*(double t)

point operator/(double t)

bool operator==(point a)

bool operator!=(point a)

};struct line

line(double _a,double _b,double _c)

line(point p,point q)

};point a[n];

int n;

//t在ab的左側返回正值

double cross(point a,point b,point t)

point getcross(point a,point b,point p,point q)

point getcross(line l1,line l2)

double getdist(point a,point b)

double getarea(point p,int n)

void movesegment(point &p1,point &p2,double r)

int m,v[n],u[n],w[n];

double cal(double a,double b,double c,point a)

void cut(point a,int &n,double a,double b,double c)

else if(t1>0&&!t2) a[n++]=b[i+1];

else if(t1>0&&t2<0) a[n++]=p,a[n++]=b[i+1];

else if(t1<0&&t2>0) a[n++]=b[i],a[n++]=p;

else if(!t1&&t2>0) a[n++]=b[i];

}m=1;

for1(i,n-1) if(a[i]!=a[i-1]) a[m++]=a[i];

if(a[m]==a[0]) m--;

n=m;

}int ok(int i,int j)

int main()

a=1.0/v[i]-1.0/v[j];

b=1.0/u[i]-1.0/u[j];

c=1.0/w[i]-1.0/w[j];

cut(a,n,a,b,c);

}if(!flag&&db(fabs(getarea(a,n)))) puts("yes");

else puts("no");

}return 0;

}

POJ 1755 Triathlon 半平面交

看的這裡 題意 鐵人三項比賽,給出 個人進行每一項的速度vi,ui,wi 對每個人判斷,通過改變3項比賽的路程,是否能讓該人獲勝 嚴格獲勝 思路 題目實際上是給出了n個式子方程,ti ai x bi y ci z 0 i n 要判斷第i個人能否獲勝,即判斷不等式組 tj ti 0,0 j n j i...

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 之後就...

LA2218 Triathlon 半平面交

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