2020牛客多校第三场 C题Operation Love(几何,模拟)

2020牛客多校第三场 C题Operation Love(几何,模拟)

Operation Love

题意:给你20个点组成的手印,判断是左手还是右手。

题解:(非官方题解)根据点与点的距离关系,找出手底部两点与拇指与小指的2两点,共4个点,可以组成一个梯形。

shou

然后枚举它的所有情况,

当dd的y坐标大于cc的y坐标,若d的x坐标大于dd的x坐标为右手,反之为左手。

当dd的y坐标小于cc的y坐标,若d的x坐标小于dd的x坐标为右手,反之为左手。

当dd的y坐标等于cc的y坐标,若d在dd上面且在c左边为右手,若d在dd下面且在c右边为右手,否则为左手。

#include<iostream>
#include<vector>
#include<cmath>
#define pb push_back
using namespace std;
int t,n;
const double minn=0.001;
double x[27],y[27];
vector<pair<double,double>>s9,s8,s6;
pair<double,double>d,c,dd,cc;
double go(int i,int j){
	return sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));
}

void gao(){
	int ok;
	if(dd.second>cc.second){
		if(d.first<dd.first){
			ok=1;
		}
		else{
			ok=0;
		}
	}
	else if(dd.second<cc.second){
		if(d.first>dd.first){
			ok=1;
		}
		else{
			ok=0;
		}
	}
	else{
		if(c.second>cc.second){
			if(d.first>c.first){
				ok=1;
			}
			else{
				ok=0;
			}
		}
		else{
			if(d.first<c.first){
				ok=1;
			}
			else{
				ok=0;
			}
		}
	}
	if(ok==1){
		printf("left
");
	}
	else{
		printf("right
");
	}
}

int main(){
	scanf("%d",&t);
	while(t--){
		s9.clear();
		s8.clear();
		s6.clear();
		for(int i=1;i<=20;i++){
			scanf("%lf%lf",&x[i],&y[i]);
		}
		for(int i=1;i<=20;i++){
			for(int j=i+1;j<=20;j++){
				if(fabs(go(i,j)-9)<=minn){
					s9.pb({x[i],y[i]});
					s9.pb({x[j],y[j]});
				}
				if(fabs(go(i,j)-8)<=minn){
					s8.pb({x[i],y[i]});
					s8.pb({x[j],y[j]});
				}
				if(fabs(go(i,j)-6)<=minn){
					s6.pb({x[i],y[i]});
					s6.pb({x[j],y[j]});
				}
			}
		}
		/*
		puts("");
		for(int i=0;i<s9.size();i++){
			printf("%lf %lf
",s9[i].first,s9[i].second);
		}puts("");
		puts("");
		for(int i=0;i<s8.size();i++){
			printf("%lf %lf
",s8[i].first,s8[i].second);
		}puts("");
		puts("");
		for(int i=0;i<s6.size();i++){
			printf("%lf %lf
",s6[i].first,s6[i].second);
		}puts("");
		*/
		for(int j=0;j<s8.size();j++){
			int ok=1;
			for(int i=0;i<s9.size();i++){
				if(s8[j]==s9[i]){
					ok=0;
				}
			}
			if(ok==1){
				c=s8[j];
			}
			else{
				cc=s8[j];
			}
		}
		for(int j=0;j<s6.size();j++){
			int ok=1;
			for(int i=0;i<s9.size();i++){
				if(s6[j]==s9[i]){
					ok=0;
				}
			}
			if(ok==1){
				d=s6[j];
			}
			else{
				dd=s6[j];
			}
		}
		gao();
	}
}

原文地址:https://www.cnblogs.com/whitelily/p/13337923.html