传送门:Operation Love
更好的阅读体验orABCFL题解:https://www.cnblogs.com/lilibuxiangtle/p/13336652.html
题意:t组测试,每次测试按顺时针或逆时针给20个点,是一个手的形状,问是左手还是右手。
题解:这个题可以用凸包解,板子求出凸包的所有点记录下来,然后求一下长度为6的边(即大拇指)的下一条边是不是底下长度为9的边。是的话就是右手,否则为左手。但是,这个题他卡精度,两个边长相等判断的时候要用fabs(d1,d2)<1e-5,比1e-5更大一些也可以,小的话会wa,wa到哭。
#include<bits/stdc++.h>
using namespace std;
struct node
{
double x,y;
}p[100],s[100];
double xx,yy;
double cross(node a,node b,node c)
{
return (b.x-a.x)*(c.y-a.y)-(c.x-a.x)*(b.y-a.y);
}
double dis(node a,node b)
{
return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
int cmp1(node a,node b)
{
if(a.y==b.y) return a.x<b.x;
return a.y<b.y;
}
int cmp2(node a,node b)
{
if(atan2(a.y-yy,a.x-xx)===atan2(b.y-yy,b.x-xx)) return a.x<b.x;
else return atan2(a.y-yy,a.x-xx)<atan2(b.y-yy,b.x-xx);
}
int main()
{
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int t;
cin>>t;
while(t--){
memset(p,0,sizeof(p));
memset(s,0,sizeof(s));
int n=20;
for(int i=0;i<n;i++){
cin>>p[i].x>>p[i].y;
}
sort(p,p+n,cmp1);
xx=p[0].x,yy=p[0].y;
sort(p+1,p+n,cmp2);
s[0]=p[0],s[1]=p[1];
int top=1;
for(int i=2;i<n;i++){
while(cross(s[top-1],s[top],p[i])<0) top--;
//如果是向右转,这个中间点就不是我们要找的点
s[++top]=p[i];//如果是向左转,就加进来
}
double q=dis({1.0,0.0},{1.0,6.0});
double y=dis({1.0,0.0},{10.0,0.0});
for(int i=0;i<=top;i++){
double k=dis(s[i],s[(i+1)%(top+1)]);
if(fabs(q-k)<1e-5) {
double x=dis(s[(i+1)%(top+1)],s[(i+2)%(top+1)]);
if(fabs(x-y)<1e-5) cout<<"right"<<endl;
else cout<<"left"<<endl;
break;
}
}
}
return 0;
}
ps:因为同步到csdn的代码实丑,就不搞显示行号了。