思路:点能够完美被分开,直线的分布情况只有两种:上方是A,下方是B;或者下方是A,上方是B,因此计算sumA,sumB的数量,只有二者之和等于n,或者等于0时才是被完美的分隔了。
代码如下:
#include<bits/stdc++.h>
using namespace std;
int n,m;
bool arr[21];
typedef struct Point{
int x,y;
char type;
int c,a,b;
}point;
int main()
{
cin>>n>>m;
point p[1001];
memset(arr,false,sizeof(arr));
for(int i=0;i<n;i++){
cin>>p[i].x>>p[i].y>>p[i].type;//输入点的信息
}
for(int i=0;i<m;i++){
int sumA=0,sumB=0;
cin>>p[i].c>>p[i].a>>p[i].b;//输入直线的信息
for(int j=0;j<n;j++){
if(p[i].c+p[i].a*p[j].x+p[i].b*p[j].y>0&&p[j].type=='A'){//A点在直线上面
sumA++;
}
if(p[i].c+p[i].a*p[j].x+p[i].b*p[j].y<0&&p[j].type=='B'){//B点在直线下面
sumB++;
}
}
if(sumA+sumB==n||sumA+sumB==0){
arr[i]=true;
}
}
for(int i=0;i<m;i++){
if(arr[i]==true){
cout<<"Yes"<<endl;
}
else{
cout<<"No"<<endl;
}
}
return 0;
}
离谱!!!需要注意的是正确的测试用例输出Yes,只有第一个Y大写;No也是只有N大写。我之前一直输出的是YES,NO,改错改了一个小时,发现是输出问题!