hdu2297Run(凸包的巧妙應用)

2022-05-15 21:25:46 字數 1340 閱讀 4157

鏈結

很巧妙的一道題,參考

把距離和速度分別作為x和y座標,以斜率代表追趕速率,簡直炫酷~

具體看上面的部落格,畫的很清楚,就不再抄寫一遍了。

1 #include 2 #include3 #include4 #include5 #include6 #include7 #include8 #include9 #include

10using

namespace

std;

11#define n 50010

12#define ll long long

13#define inf 0xfffffff

14const

double eps = 1e-8;15

const

double pi = acos(-1.0

);16

const

double inf = ~0u>>2;17

struct

point

1821

}p[n],ch[n];

22typedef point pointt;

23 point operator -(point a,point b)

2427

double

cross(point a,point b)

2831

int dcmp(double

x)32

36double

mul(point p0,point p1,point p2)

3740

double

dis(point a)

4144

bool

cmp(point a,point b)

4551

int graham(int

n)52

61if(k!=0)62

67 sort(p+1,p+n,cmp);

68 ch[0] = p[0

];69 ch[1] = p[1

];70 top = 1;71

for(i = 2; i < n ; i++)

7278

return

top;79}

80int

main()

8196

for(i = 0 ; i <= m ; i++)

97104

if(ch[i].y>maxy)

105109

}110 cout<1

<

111}

112return0;

113 }

view code

HDU 2297 Run 計算幾何 凸包思想

題意 一維線段n個可以運動的點,位置為p,速度為v。求在運動的過程中有多少點可以領跑 在最前面 分析 可以將速度v也變成乙個維度,乙個點要超過另乙個點的前提條件是速度更大,其中可以根據求凸包的思想,如果這個點到另乙個點的相對距離與相對速度做除法運算,即求得斜率。斜率大的可以更先跑到前面並且不會被他超...

hdu1392凸包求周長

浩哥告訴說要用atan掃點而且只用掃瞄一遍就好了 我用兩都掃的方法不知道為什麼錯了好多次,求高手指教!下面是我用tan排序ac的 include include include define max 1000 define eps 1e 12 using namespace std struct p...

hdu 5033 單調棧 凸包

將人看成高度為 的樓,與樓混在一起按照橫座標排序,用單調棧正著掃一遍,再反著掃一遍,分別求出豎直線兩側的高度 出棧的條件 當前樓的高度比棧頂的樓高 為了維護凸包的性質,若棧頂和之前樓的斜率大於棧頂和當前樓的斜率 均為絕對值 出棧 如果當前樓是人,向前出棧直至找到棧頂樓與人夾角大於之前的樓與人的夾角 ...