根据高中知识我们知道,通过将点带入直线方程得到大于0或等于0或小于0,其中大于0与小于0的情况即对应两个点在直线的两边
据此,我们取最后一个输入的A点作为标准、最后一个输入的B点作为标准,记录下他们的>0还是<0,然后去遍历所有的点,如果存在A点与前面A点的记录冲突则输出No,同理,如果存在B点与前面B点的记录冲突则输出No
没输出No,则输出Yes
#include<iostream> #include<string> using namespace std; int n,m; typedef struct Node{ int x,y; char type; bool where;//记录该点位于直线的哪边 }Node; Node arr[1005]; int main(){ cin>>n>>m; for(int i=1;i<=n;i++){ cin>>arr[i].x>>arr[i].y>>arr[i].type; } while(m--){ string ans="Yes"; int a,b,c; cin>>c>>b>>a; bool checkA=0,checkB=0; for(int i=1;i<=n;i++){ int temp=c+arr[i].x*b+arr[i].y*a; arr[i].where=temp>0?1:0; if(arr[i].type=='A'){ checkA=arr[i].where;//记录A点都需要在哪边 }else{ checkB=arr[i].where;//记录B点都需要在哪边 } } for(int i=1;i<=n;i++){ if(arr[i].type=='A'&&arr[i].where!=checkA){ ans="No";//如果有A点与之前的记录冲突 break; } if(arr[i].type=='B'&&arr[i].where!=checkB){ ans="No";//如果有B点与之前的记录冲突 break; } } cout<<ans<<endl; } return 0; }