【ccf csp】202006-1 线性分类器 满分代码 C++

试题编号:202006-1

试题名称:线性分类器

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

思路:

主要先以第一个输入点确定好两类标准。比如我以char c1,c2;为两类标准,我规定了c1表示的类别始终是a0+a1x+a2y>0,c2表示的类别始终是a0+a1x+a2y<0。关键在于第一个输入点满足哪个方程,如果满足c1类别,那么把第一个输入点的类型A(B)赋给c1,c2则为B(A);反之,类推即可。

代码:

#include <iostream>
using namespace std;
struct node{
	int x;
	int y;
	int res;
	char type;
};
struct line{
	int a0;
	int a1;
	int a2;
}; 
//此题关键在于解决一个初始标准条件 
int main()
{
	int n,m,i,j;
	cin>>n>>m;		//输入n个点,m个查询
	node p[n];
	line l[m];
	char c1,c2; //两个标准,c1为正,c2为负 
	bool flag;
	for(i=0;i<n;i++)
		cin>>p[i].x>>p[i].y>>p[i].type;	
	for(i=0;i<m;i++)
		cin>>l[i].a0>>l[i].a1>>l[i].a2;
	
	//计算 
	for(i=0;i<m;i++)
	{
		flag = true;
		//计算初始点 确定一个标准  c1是正的,c2是负的
		p[0].res = l[i].a0+l[i].a1*p[0].x+l[i].a2*p[0].y;
		if(p[0].res>0 && p[0].type=='A') {c1='A';c2='B';}
		if(p[0].res>0 && p[0].type=='B') {c1='B';c2='A';}
		if(p[0].res<0 && p[0].type=='A') {c1='B';c2='A';}
		if(p[0].res<0 && p[0].type=='B') {c1='A';c2='B';}
		
		for(j=1;j<n;j++)
		{
			p[j].res = l[i].a0+l[i].a1*p[j].x+l[i].a2*p[j].y;
			if(p[j].res<0 && p[j].type == c1)
				{
					cout<<"No"<<endl;
					flag = false;
					break;
				}
			if(p[j].res>0 && p[j].type == c2)
				{
					cout<<"No"<<endl;
					flag = false;
					break;
				}
		}
		if(flag) cout<<"Yes"<<endl;
	}
	return 0;
}
  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值