CCF-CSP 202006-1 线性分类器(简单易懂,逻辑清晰,代码极简)

题目传送门: 线性分类器

样例给你们~

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;
	}
 } 

大家有疑问的欢迎留言,共同学习,共同进步~~~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值