牛客暑期多校训练营C Operation Love

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述


题目大意:

给出20个坐标(顺逆时针都可能),确定是爱丽丝的左手掌还是右手掌


题目思路:

先找到具有代表性的长度为9的手掌向量,然后计算与其相连的两条向量的叉乘,若属于大拇指的向量与长度为9的向量的叉乘小于0,且属于小拇指的向量与长度为9的向量的叉乘大于零,则这是右手掌,若反之前者叉乘大于0,后者叉乘小于0,则是左手掌


#include<bits/stdc++.h>
using namespace std;
struct zb 
{
 	double x,y;
} a[30];
double dis(zb x,zb y) //边长
{
 	return sqrt((x.x-y.x)*(x.x-y.x)+(x.y-y.y)*(x.y-y.y));
}
double cj(zb x,zb y,zb z) //叉积
{
 	return (y.x-x.x)*(z.y-x.y)-(y.y-x.y)*(z.x-y.x);
}
int main()
{
 	int t,i;
 	bool flag;
 	const double e=1e-5;
 	scanf("%d",&t);
 	while(t--)
 	{
  		flag=0;
  		for(i=0;i<20;i++)
   			scanf("%lf%lf",&a[i].x,&a[i].y);
  		for(i=0;i<20;i++)
   			if(fabs(dis(a[i],a[(i+1)%20])-9)<e)
   			{
    				po x=a[i],y=a[(i+1)%20],z=a[(i+2)%20];
    				if(cj(x,y,z)>0 && fabs(dis(y,z)-6)<e || cj(x,y,z)<0 && fabs(dis(y,z)-8)<e) flag=1;
    					break;
   			} 
  		if(flag) 
   			printf("left\n");
  		else 
   			printf("right\n");
 }
    return 0;
}

!!!代码搬自题解讨论区!!!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值