CCFCSP试题编号:202006-1试题名称:线性分类器

这题妾身先想的是怎么判段点在那一侧,仔细想了一下,发现只要将点的坐标代入直线表达式,判断结果是大于还是小于0,就是点在直线的左侧(上侧)还是右侧(下侧)。

那么接下来就是看A类点在全部为直线左侧的同时,判断B类点是否全部在右侧,反之亦然。

诶呀,由于小女子实在是太笨了,想不到好办法。只能采用最笨的方法就是统计A类点在左侧的个数和右侧的个数,看看哪一侧等于A类点的总个数,同时判断B类点在另一侧是否也等于B类点的总个数。

上代码!哈哈^_^

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

//点结构体
struct point
{
	int x;
	int y;
	char type;
}p[1001];
int main()
{
	int n, m;
	cin >> n >> m;
	int i, j;
	int a, b, c;
	
	for (j = 0; j < n; j++)
	{
		cin >> p[j].x >> p[j].y >> p[j].type;
	}
	for (i = 0; i < m; i++)
	{
		cin >> a >> b >> c;
		int sumA = 0, sumB = 0, sumA1 = 0, sumA2 = 0, sumB1 = 0, sumB2 = 0;
		for (j = 0; j < n; j++)
		{
			int sum = a + b * p[j].x + c * p[j].y;
			if (p[j].type == 'A')
			{
				sumA++;
				if (sum > 0)
				{
					sumA1++;
				}
				else
				{
					sumA2++;
				}
			}
			else
			{
				sumB++;
				if (sum > 0)
				{
					sumB1++;
				}
				else
				{
					sumB2++;
				}
			}
		}
		if ((sumA == sumA1 && sumB == sumB2) || (sumA == sumA2 && sumB == sumB1))
		{
			cout << "Yes" << endl;
		}
		else
		{
			cout << "No" << endl;
		}
	}

	system("pause");
	return 0;
}

其实妾身也查看了别人的方法,就是将第一个点作为基准,看看同类点是否依旧同样大于或者小于0,可是妾身写了,感觉应该没错,但是在csp模拟考试中提交只得了60分,然后始终找不到错误,只好放弃了,也就没有贴上这个代码,以后有机会一定会重新试试看。小女子会加油的!

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值