給出n個人,還有他們在鐵人三項中游泳、自行車和賽跑的速度,問通過合理設計三個比賽的長度,哪些人可能成為冠軍(不能是並列的)。
設行程總長度為1,其中游泳的長度為x,自行車的長度為y,則賽跑的長度為1-x-y,若i可能成為冠軍,則令f
(i)=
xv[i
]+yu
[i]+
1−x−
yw[i
],有f
(i)j)(j
≠i) 之後就是解不等式組了。
可以將速度同時擴大k倍。有乙個重要的剪枝就是如果j的各方面速度均》=i,那麼直接輸出no,或者是如果j的各方面速度均<=i,那麼不用考慮i-j不等式的半平面。
這樣做就是為了減少精度誤差導致wa,貌似後面的資料精度要求很高。
具體的做法好像有兩種:一種是計算半平面交之後剩下來的點數,還有一種是計算半平面交之後剩下凸包的面積,discuss裡說後一種方法精度要求極高。對於後一種方法,我還是需要加上剪枝才能ac。
#include
#include
#include
#include
#include
#include
#include
using namespace std;
#define all(x) (x).begin(), (x).end()
#define for0(a, n) for (int (a) = 0; (a) < (n); (a)++)
#define for1(a, n) for (int (a) = 1; (a) <= (n); (a)++)
#define mes(a,x,s) memset(a,x,(s)*sizeof a[0])
#define mem(a,x) memset(a,x,sizeof a)
#define ysk(x) (1<<(x))
typedef long long ll;
typedef pair pii;
const int inf =0x3f3f3f3f;
const int maxn= 100 ;
const double pi=acos(-1.0);
const double eps=1e-10;
int dcmp(double x)
struct point
; bool operator ==(const point b)const
bool operator<(const point& b)const
};typedef point vector;
vector operator -(vector a,vector b)
double cross(vector a,vector b)//叉乘
double dot(vector a,vector b)//點乘
vector operator +(vector a,vector b)
vector operator *(vector a,double p)
vector operator /(vector a,double p)
vector operator -(vector a)
double length(vector a)
struct line
line(point a,vector v):p(a),v(v)//點線式
void twopointintial(point p,point p2)//兩點式
point point(double t)//引數方程求引數t對應點
bool operator<(const line & l)const
bool onright(line l,point p)
int halfplaneintersection(line* l,int n)
if(first}
while(firstif(last-first<=1) return
0;//小於3個,不存在
p[last]=getintersection(q[last],q[first]);
return
last-first+1;
}double v[maxn+3],u[maxn+3],w[maxn+3];
line l[maxn+6];
int main()
l[nl++]=line(p,v);
//printf("i=%d,j=%d\n",i,j);
// cout<" "
<" "
<<" "
<1].p.x
<<" "
<1].p.y
<<" "
<1].v.x
<<" "
<1].v.y
if(ok) 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(半平面交)
題意 一段距離總長度為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...