线性分类器 第19次CCF CSP认证 202006-1 C++题解

本文介绍了2020年CCF CSP认证中第19次线性分类器问题的解题思路。通过高中数学知识,利用两点在同一侧的性质,判断直线能否将两类点完全分开。算法包括:选取一点代入直线方程得到标准值,遍历同类点判断是否在同一侧,再对比不同类点。C++实现中需要注意变量类型,使用long long防止溢出。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

原题链接

202006-1 CSP 线性分类器

 

算法分析

根据高中数学学过的知识,如果两点在直线的同一侧,则其代入方程的值正负相同。据此有如下算法:

(1)取某一点,不妨设为A类型的点,代入当前所需验证的直线方程,获得一个标定值,暂记为standard。

(2)将另一个A类型的点代入直线方程,得一个值,暂记为temp。如果两点在直线的同一边,则standard * temp > 0;遍历所有的A类型点。若有任意一点使得standard * temp < 0,则意味着该条直线无法将所有A类型点分割到同一侧,输出“No”,结束本次算法。

(3)沿用(1)中的standard值对B类型的点进行比较,若对于所有B类型的点,都有standard * temp < 0,输出“Yes”;否则,输出“No”,结束本次算法。

(4)反复进行(1)~(3)直至验证所有的直线。

ps. 如果采用C++编写,上述standard和temp变量务必定义为long long类型,如果是int就WA了(亲测)(菜哭)

以下是AC代码:

 

代码

//采用C++
//15ms 544KB

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

struct point {
	int x;
	int y;
};

struct line {
	int a, b, c;
}; 

int main() {
	int n, m;
	vector<point> points_a;
	vector<point> points_b;
	vector<line> 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值