1. 程式人生 > 實用技巧 >2020牛客多校第三場C題Operation Love(叉積 模擬幾何)

2020牛客多校第三場C題Operation Love(叉積 模擬幾何)

題目連結https://ac.nowcoder.com/acm/contest/5668/C

題意:輸入20個座標,判斷是左手還是右手,手的大小不變。

題解:我們根據邊長可以找到最底下一條邊的點和大拇指的最左邊的點。叉積一下判斷正負就可以判斷是左手還是右手。

找點暴力求解就可以,下面解釋一下叉積就是把線段看成向量,就是高中學的向量的乘積。

OA=(x1,y1)OB=(x2,y2)
定義叉積:OA×OB=x1y2 -x2y1。

叉積的作用
1:確定三角形的面積,叉積相乘除以2

2:已知直線上的兩點s、e,可以求出ax+by+c=0的引數
a = s.y-e.y;
b = e.x-s.x;
c = s×e;

大佬歸納https://blog.csdn.net/Danliwoo/article/details/49836983?utm_medium=distribute.pc_relevant.none-task-blog-OPENSEARCH-4.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-OPENSEARCH-4.nonecase

#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#include <bits/stdc++.h>
#define
inf 0x3f3f3f3f using namespace std; typedef long long ll; const int maxn=20+7; const ll mod =1e9+7; int t; double x[maxn],y[maxn]; double cal(double x1,double y1,double x2,double y2){ return (x2-x1)*(x2-x1)+(y2-y1)*(y2-y1); } int main(){ scanf("%d",&t); while(t--){ double ma=-1
; int pos1,pos2,l,mid,r; for(int i=1;i<=20;i++){ scanf("%lf%lf",&x[i],&y[i]); } x[0]=x[20],y[0]=y[20]; x[21]=x[1],y[21]=y[1]; x[22]=x[2],y[22]=y[2]; for(int i=1;i<=20;i++){ double len=cal(x[i],y[i],x[i+1],y[i+1]); if(len>ma){ ma=len; pos1=i,pos2=i+1; } } if(cal(x[pos1],y[pos1],x[pos1-1],y[pos1-1])<cal(x[pos2],y[pos2],x[pos2+1],y[pos2+1])){ l=pos1-1,mid=pos1,r=pos2; }else{ l=pos2+1,mid=pos2,r=pos1; } if((x[r]-x[mid])*(y[l]-y[mid])-(x[l]-x[mid])*(y[r]-y[mid])<0){ printf("left\n"); }else{ printf("right\n"); } } return 0; }