2020牛客多校C题:Operation Love

题目链接

比赛的时候蒟蒻不会做,连叉乘是啥怎么算都忘了qaq

先来说下叉乘怎么算吧,a=(Xa,Ya,Za),b=(Xb,Yb,Zb),两三维向量的叉乘:|axb|=|a|b]sin<a,b>,axb=(YaZb-ZaYb)i+(ZaXb-ZbXa)j+(XaYb-XbYa)z,而二维向量可以看成三维向量的z为0,则二维向量的叉乘为(XaYb-Xb*Ya)z

我们再回到题目,我们来看看左右手的叉乘的特征(以正常放置为例)。
2020牛客多校C题:Operation Love_第1张图片
所以我们可以按上面的规律来判断左右手,所以我们的任务是找到代表掌低的向量,即模长为9的向量,然后判断其所连接的小拇指/大拇指向量符合哪条规律。

AC代码

#include
#include
#include
#include
#include
#include
#include

using namespace std;

const int N = 1E5 + 10;
const double eps = 0.1;

int arr[N];

struct node {
	double x;
	double y;
}date[30];


double cross(node x,node y,node z) {
	return (x.x - z.x) * (y.y - z.y) - (y.x - z.x) * (x.y - z.y);
}

double dis(node x, node y) {
	return sqrt((x.x - y.x)*(x.x - y.x) + (x.y - y.y)*(x.y - y.y));
}

int main() {
	int t;
	scanf("%d", &t);
	while (t--) {
		bool flag=false;
		for (int i = 1; i <= 20; i++) {
			scanf("%lf %lf", &date[i].x, &date[i].y);
		}
		date[21] = date[1];
		date[22] = date[2];
		for (int i = 1; i <= 20; i++) {
			if (fabs(dis(date[i], date[i + 1]) - 9) <= eps) {
				if ((fabs(dis(date[i + 1], date[i + 2]) - 8) <= eps && cross(date[i], date[i + 1], date[i + 2]) > 0)||(fabs(dis(date[i+1],date[i+2])-6)<=eps&&cross(date[i],date[i+1],date[i+2])<0)) {//不是左手就是右手,所以只判断是否是某只手就可以,但不过;两个一起判应该会快一些
					flag = true;
					break;
				}
			}
		}
		if (flag) printf("right\n");
		else printf("left\n");
	}
}

你可能感兴趣的:(几何学)