1. 问题链接:CSP202006-1 线性分类器
试题编号: | 202006-1 |
---|---|
试题名称: | 线性分类器 |
时间限制: | 1.0s |
内存限制: | 512.0MB |
问题描述: | ![]() ![]() ![]() |
2. 问题分析:
经过读题分析,采用判断直线方程表达式正负情况作为是否A,B完美分类的标准,即把A或者B类点带入表达式 θ 0 + θ 1 ∗ x i + θ 2 ∗ y i > 0 \theta_0+\theta_1*x_i+\theta_2*y_i>0 θ0+θ1∗xi+θ2∗yi>0,统计A或者B类点小于和大于0的点数,若A类全大于0并且B类全部小于0或者B类全大于0并且A类全部小于0,则为完美分割,需要注意scanf函数格式输入符读取类别字符串只能用 % s \%s %s,不能用 % c \%c %c,否则会导致循环提前读取终止。
3. C++语言程序实现:
#include <iostream>
#include <cstdlib>
#define N 1000
using namespace std;
int dot_arr[N+1][2]={0};
char type_arr[N+1];
int main()
{
int n,m,A_less_than_0,A_greater_than_0,B_less_than_0,B_greater_than_0;
bool res;
scanf("%d%d",&n,&m);
for (int i=0; i<n ; i++ )
{
scanf("%d%d%s",&dot_arr[i][0],&dot_arr[i][1],&type_arr[i]);
}
int param_arr[m][3]= {0};
for (int i=0; i<m ; i++ )
{
scanf("%d%d%d",¶m_arr[i][0],¶m_arr[i][1],¶m_arr[i][2]);
}
for (int i=0; i<m ; i++ )
{
A_less_than_0=0,A_greater_than_0=0,B_less_than_0=0,B_greater_than_0=0;
for (int j=0; j<n ; j++ )
{
res=(param_arr[i][0]+param_arr[i][1]*dot_arr[j][0]+param_arr[i][2]*dot_arr[j][1]>0);
if (type_arr[j]=='A')
{
if (res)
{
A_greater_than_0+=1;
}
else
{
A_less_than_0+=1;
}
}
else
{
if (res)
{
B_greater_than_0+=1;
}
else
{
B_less_than_0+=1;
}
}
}
if ((A_less_than_0==0&&B_greater_than_0==0)||(B_less_than_0==0&&A_greater_than_0==0))
{
printf("Yes\n");
}
else
{
printf("No\n");
}
}
return 0;
}