2020牛客多校第三场 C题Operation Love(几何,模拟)
2020牛客多校第三场 C题Operation Love(几何,模拟)
题意:给你20个点组成的手印,判断是左手还是右手。
题解:(非官方题解)根据点与点的距离关系,找出手底部两点与拇指与小指的2两点,共4个点,可以组成一个梯形。
然后枚举它的所有情况,
当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\n");
}
else{
printf("right\n");
}
}
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\n",s9[i].first,s9[i].second);
}puts("");
puts("");
for(int i=0;i<s8.size();i++){
printf("%lf %lf\n",s8[i].first,s8[i].second);
}puts("");
puts("");
for(int i=0;i<s6.size();i++){
printf("%lf %lf\n",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();
}
}