poj1696(極角排序,貪心)

2022-08-21 18:12:09 字數 2672 閱讀 5688

---恢復內容開始---

題意:有n個點,規定起點,每次只能向左走,不能與之前的路徑交叉,求最多能經過幾個點。

思路:其實這題因為起點的y座標最小,那麼經過的點數一定就是所有的點數n,然後顯然我們優先選擇偏移角度最小的點作為後繼,也就是極角最小,那麼每次選擇乙個點後都按極角公升序排一次即可。我的**是遍歷了一遍,因為資料量本身很小。**有些亂,main函式前都是模板。

ac code:

#include#include

#include

#include

using

namespace

std;

const

double eps=1e-8

;const

double inf=1e20;

int sgn(double

x)struct

point

point(

double xx,double

yy):x(xx),y(yy){}

point

operator + (const point& b)const

point

operator - (const point& b)const

double

operator * (const point& b)const

double

operator ^ (const point& b)const

//繞原點旋轉角度b(弧度值),後x、y的變化

void transxy(double

b)};

struct

line

line(point ss,point ee)

//兩直線相交求交點

//第乙個值為0表示直線重合,為1表示平行,為2表示相交

//只有第乙個值為2時,交點才有意義

pair operator &(const line &b)const

double t = ((s-b.s)^(b.s-b.e))/((s-e)^(b.s-b.e));

res.x += (e.x-s.x)*t;

res.y += (e.y-s.y)*t;

return make_pair(2

,res);

}};//

判斷線段相交

bool

inter(line l1,line l2)

double

dis(point a,point b)

//bool

onseg(point p,line l)

//判斷點在凸多邊形內,複雜度o(n)

//點形成乙個凸包,而且按逆時針排序(如果是順時針把裡面的<0改為》0)

//點的編號:0~n-1

//返回值:

//-1:點在凸多邊形外

//0:點在凸多邊形邊界上

//1:點在凸多邊形內

int inconvexpoly(point a,point p,int

n)//

判斷點在任意多邊形內,複雜度o(n)

//射線法,poly的頂點數要大於等於3,點的編號0~n-1

//返回值

//-1:點在凸多邊形外

//0:點在凸多邊形邊界上

//1:點在凸多邊形內

int inpoly(point a,point p,int

n)

else

if(onseg(side.e,ray))

else

if(inter(ray,side)) ++cnt;

}if(cnt%2==1) return1;

else

return -1;}

const

int maxn=55

;point pt[maxn];

line line[maxn];

intt,n,cnt,ans[maxn],vis[maxn];

intmain()

}cnt=0

; line[++cnt]=line(point(0

,pt[tmp].y),pt[tmp]);

ans[cnt]=tmp;

vis[tmp]=1

;

while(1

)

if(!f) continue

;

double now=(pt[i]-line[cnt].e)*(line[cnt].e-line[cnt].s)/dis(pt[i],line[cnt].e)/dis(line[cnt].e,line[cnt].s);

if(now>max)

}if(!tmp) break

; vis[tmp]=1

; line[++cnt]=line(line[cnt-1

].e,pt[tmp]);

ans[cnt]=tmp;

}printf("%d

",cnt);

for(int i=1;i<=cnt;++i)

printf("%d

",ans[i]);

printf("\n

");}

return0;

}

極角排序 POJ1696

vj題目連線 一種奇怪的蟲子不能右轉且走過路線之間不能有交點,吃植物才能存活,給出植物的座標,求蟲子要怎樣走才能活得最久 吃的植物越多活越久 輸入 樣例數,n組樣例,每組給出乙個n,然後n行每行給出3個數,分別是植物編號 植物x座標 植物y座標 輸出 能吃的最大植物數目,並給出路線 因為蟲子只能左轉...

POJ 1696 極角排序

題目中指定了ant爬行時的幾種規則,從中我們可以知道ant是按照當前所處位置,對其他的plant進行極角排序後,選擇角度最小過去,重複,一直到走到最後乙個plant。sort一發就可以了 include include include include include const double eps...

POj 1696 Space Ant (極角排序)

題意 乙隻螞蟻,只會向左轉,現在給出平面上很多個點,求解一種走法,能使得螞蟻能經過的點最多,每個頂點該螞蟻只能經過一次,且所行走的路線不能發生交叉.對於題目所輸入的點,先找出最左下方的頂點 即縱座標最小的頂點 然後對剩下的頂點按照對與左下點的極角排序,然後反覆找最左下的點,反覆進行極角排序,同時記錄...