解题误区:
本题的关键根据是c+bx+ay>0或c+bx+ay<0来划分两类点,在解题时误用了只判断是否是同号的方法,忽略了所有点都可能为正或都为负的情况,所以结果错误。
本题需严格按照A类大于0并且B类小于0,或者A类小于0并且B类大于0(不考虑=0)。
正确代码如下:
#include <iostream>
using namespace std;
struct node
{
int x,y;
char type;
};
struct line
{
int c0,c1,c2;
};
int dz(int num[],int n)//判断所有的数是否都大于0
{
int flag = 1;
for(int i=0;i<n;i++)
{
if(num[i]<0)
{
flag=0;
break;
}
}
return flag;
}
int xz(int num[],int n)//判断所有的数是否都小于0
{
int flag = 1;
for(int i=0;i<n;i++)
{
if(num[i]>0)
{
flag=0;
break;
}
}
return flag;
}
node no[1000];
line l[20];
int a[1000];
int b[1000];
int main()
{
int n,m;
cin>>n>>m;
for(int i=0;i<n;i++)
cin>>no[i].x>>no[i].y>>no[i].type;
for(int i=0;i<m;i++)
cin>>l[i].c0>>l[i].c1>>l[i].c2;
for(int i=0;i<m;i++)
{
int t=0,k=0,p=0;
for(int j=0;j<n;j++)
{
t=l[i].c0+no[j].x*l[i].c1+no[j].y*l[i].c2;
if(no[j].type=='A')
{
a[k]=t;
k++;
}
else if(no[j].type=='B')
{
b[p]=t;
p++;
}
}
if((dz(a,k)==1&&xz(b,p)==1)||(xz(a,k)==1&&dz(b,p)==1))
cout<<"Yes"<<endl;
else
cout<<"No"<<endl;
}
return 0;
}
总结:
一定要细心考虑全面,不能因为看似简便的方法而忽略解题的关键,从而导致错误。