hhw学长挂的一个简单凸包问题,然后我爆了…因为没学过
然后去看了看发现还不算难,蛮简单的
这个讲的详细
我就只挂一下自己的写法吧,多熟悉熟悉
很明显需要求出一个凸包,然后计算周长,x轴不需要考虑,所以不需要加上x轴的距离,套一个板子求出点的集合就OK了
struct Point{
double x,y;
};
double cross(Point a1,Point b1,Point a2,Point b2){
double xx1=b1.x-a1.x;
double xx2=b2.x-a2.x;
double yy1=b1.y-a1.y;
double yy2=b2.y-a2.y;
return xx1*yy2-xx2*yy1;
}
bool cmpx(Point a,Point b){
if(a.x==b.x){
return a.y<b.y;
}else{
return a.x<b.x;
}
}
vector<Point> convex_hull(vector<Point>p,int n){
sort(p.begin(),p.end(),cmpx);
int k=0;
vector<Point>q(2*n);
rep(i,0,n-1){
while(k>1&&cross(q[k-1],q[k-2],p[i],q[k-1])<=0){
k--;
}
q[k++]=p[i];
}
int t=k;
per(i,n-2,0){
while(k>t&&cross(q[k-1],q[k-2],p[i],q[k-1])<=0){
k--;
}
q[k++]=p[i];
}
q.resize(k-1);
return q;
}
double get_dis(Point a,Point b){
return sqrt(pow(a.x-b.x,2)+pow(a.y-b.y,2));
}
void solve(){
int n;
double m,L;
scanf("%d %lf %lf",&n,&m,&L);
vector<Point>p;
Point tmp;
tmp.x=0.0,tmp.y=0.0,p.pb(tmp);
tmp.x=m,tmp.y=0.0,p.pb(tmp);
n+=2;
rep(i,3,n){
scanf("%lf %lf",&tmp.x,&tmp.y);
p.pb(tmp);
}
vector<Point>q=convex_hull(p,n);
double dis=0;
sort(q.begin(),q.end(),cmpx);
//dis+=m;
int sz=q.size();
rep(i,0,sz-2){
dis+=get_dis(q[i],q[i+1]);
if(dis>L){
break;
}
}
//de(dis);
if(dis<=L){
puts("Supreme Golden Joe");
}else{
puts("Overlord");
}
}