C++写CCF CSP 202006-1 线性分类器

思路:
numA表示A点的个数,numB表示B点的个数;
da表示在给定直线上方的A点个数,xa表示在给定直线下方的A点个数;
db表示在给定直线上方的B点个数,xb表示在给定直线下方的B点个数;

若A点全在直线上方,B点全在下方,或者A点全在下方,B点全在上方时,给定直线可完美分割A、B点。即numA == da && numB == xb || numA == xa && numB == db。

代码如下:

#include <iostream>
using namespace std;

class Point{
public:
	int x;
	int y;
	char type;
};

int main(void){

	int n,m,i,M;
	int numA = 0,numB = 0,da,db,xa,xb;
	int a,b,c;
	int judge[25] = {0};
	Point point[1010];
	
	cin>>n>>m;
	M = m;

	for(i = 0;i < n; ++i){
		cin>>point[i].x>>point[i].y>>point[i].type;
		point[i].type == 'A'? numA ++:numB++;
	}

	while(m--){
		cin>>a>>b>>c;
		da = db = xa = xb = 0;

		for(i = 0;i < n; ++ i){

			if(point[i].type == 'A'){
				if( (a + b * point[i].x + c * point[i].y) > 0 )da ++;
				else xa ++;
			}

			if(point[i].type == 'B'){
				if( (a + b * point[i].x + c * point[i].y) > 0 )db ++;
				else xb ++;
			}
		}

		if( (numA==da && numB == xb) || (numA==xa && numB == db) )judge[m + 1] = 1;

	}

	for(i = M;i > 0;-- i){
		if(judge[i] == 1)cout<<"Yes"<<endl;
		else cout<<"No"<<endl;
	}

	return 0;

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值