题目传送门: 线性分类器
样例给你们~
9 3
1 1 A
1 0 A
1 -1 A
2 2 B
2 3 B
0 1 A
3 1 B
1 3 B
2 0 A
0 2 -3
-3 0 2
-3 1 1
题解
首先我们用结构体存每个点的坐标和类型,接着用两个数组分别存两类点带入到方程中的值,然后用judge函数判断是否所有A点都小于0而且所有B点都大于0,或者所有A点都大于0而且所有B点都小于0,即A、B两类点分居直线两侧。
参考代码
#include<bits/stdc++.h>
using namespace std;
struct Point{
int x,y;
char type;
}p[1005];
bool judge(int a[],int lena,int b[],int lenb){// 判断A、B两类点的位置
int azheng=0,afu=0,bzheng=0,bfu=0;
for(int i=0;i<lena;i++){
if(a[i]>0) azheng++;
else afu++;
}
for(int i=0;i<lenb;i++){
if(b[i]>0) bzheng++;
else bfu++;
}
if((azheng==lena&&bfu==lenb)||(afu==lena&&bzheng==lenb))
return true;
return false;
}
int main()
{
int N,M,x1,x2,x3;
int a[1005],b[1005];
cin>>N>>M;
for(int i=0;i<N;i++){
cin>>p[i].x>>p[i].y>>p[i].type;
}
while(M--){
int m=0,n=0;
cin>>x1>>x2>>x3;
for(int i=0;i<N;i++){
int num=x1+x2*p[i].x+x3*p[i].y;//每个坐标点带入到方程中的值
if(p[i].type=='A'){ //如果是A类点
a[m++]=num;
}
if(p[i].type=='B'){ //如果是B类点
b[n++]=num;
}
}
if(judge(a,m,b,n)) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
}
}
大家有疑问的欢迎留言,共同学习,共同进步~~~