CSP 202006-1 线性分类器

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

题目分析

  先将输入的A、B两类点分别保存起来,当输入直线的三个参数之后,去判断此直线能否进行分类。判断方法是将每个点代入直线中,进行计算,然后看计算结果的正负性,若A类点的计算结果的符号和B类点计算结果的符号相反,那么说明此条直线可以进行分类,否则不能分类。

源代码

#include<iostream>
#include<vector>
using namespace std;

int c1, c2, c3;
void Calculate(vector<pair<int, int>> v, int& flag) {
	for (auto i : v) {
		if (c1 + c2 * i.first + c3 * i.second > 0) {
			if (flag == -1) {	//上一次的计算结果小于0,这一次大于0,说明无法分类
				flag = 0;
				return;
			}
			else
				flag = 1;
		}
		else {
			if (flag == 1) {
				flag = 0;
				return;
			}
			else
				flag = -1;
		}
	}
}
int main() {
	int n, m;
	int x, y;
	char type;
	vector<pair<int, int> > v1, v2;	//分别存放A类点和B类点
	int flag1 = 0, flag2 = 0;
	cin >> n >> m;
	while (n--) {
		cin >> x >> y >> type;
		if (type == 'A')
			v1.push_back(make_pair(x, y));
		else
			v2.push_back(make_pair(x, y));
	}
	while (m--) {
		cin >> c1 >> c2 >> c3;
		flag1 = 0;
		flag2 = 0;
		Calculate(v1, flag1);
		Calculate(v2, flag2);
		if (flag1 * flag2 >= 0)
			cout << "No" << endl;
		else
			cout << "Yes" << endl;
	}
	return 0;
}
/*
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
*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值