线性分类器
题目
输出
输出到标准输出。
输出共 m 行,每行输出一个字符串。
第 j 行(1 ≤ j ≤ m)输出的字符串对应第 j 个查询的结果:如果给定直线可以完美分隔A、B 两类点,则输出Yes;否则输出No。
输入样例
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
输出样例
No
No
Yes
样例解释
只有第 3 个查询给出的直线能将A、B 两类点完美分隔。
解题思路
将点的坐标代入直线方程,通过计算结果大于0还是小于0,判断点在直线的哪一侧。
参考代码:
#include<stdio.h>
int main ()
{
int n,m;
scanf("%d %d",&n,&m);
int p[n][2];
char x[n];
int y[m][3];
for(int i=0;i<n;i++)
{
scanf("%d %d %c",&p[i][0],&p[i][1],&x[i]);
}
for(int i=0;i<m;i++)
{
scanf("%d %d %d",&y[i][0],&y[i][1],&y[i][2]);
}
int A[n],B[n];
int a=0,b=0;
for(int i=0;i<m;i++)
{
a=0,b=0;
for(int j=0;j<n;j++)
{
if(x[j]=='A')
{
if(y[i][0]+y[i][1]*p[j][0]+y[i][2]*p[j][1]>0)
{
A[a]=1;
a++;
}
if(y[i][0]+y[i][1]*p[j][0]+y[i][2]*p[j][1]<0)
{
A[a]=0;
a++;
}
}
if(x[j]=='B')
{
if(y[i][0]+y[i][1]*p[j][0]+y[i][2]*p[j][1]>0)
{
B[b]=1;
b++;
}
if(y[i][0]+y[i][1]*p[j][0]+y[i][2]*p[j][1]<0)
{
B[b]=0;
b++;
}
}
}
bool flag1=true,flag2=true;
for(int i=0;i<a-1;i++)
{
if(A[i]!=A[i+1])
{
flag1=false;
break;
}
}
for(int i=0;i<b-1;i++)
{
if(B[i]!=B[i+1])
{
flag2=false;
break;
}
}
if(flag1&&flag2)
{
if(A[0]!=B[0])
printf("Yes\n");
else
printf("No\n");
}
else{
printf("No\n");
}
}
return 0;
}