CCF 202006-1 线性分类器(C++)

202006-1 线性分类器

试题编号: 202006-1
试题名称: 线性分类器
时间限制: 1.0s
内存限制: 512.0MB
问题描述:CCF 202006-1 线性分类器(C++)_第1张图片

CCF 202006-1 线性分类器(C++)_第2张图片
CCF 202006-1 线性分类器(C++)_第3张图片
CCF 202006-1 线性分类器(C++)_第4张图片

解题过程

通过直线方程,将每个点处于直线上方或是下方计算出来(处于直线同侧的点代入直线方程后得到结果同号)。然后对于每条直线,遍历按照位置排序后的每个点,如果处于同侧的点存在不同类型,则中止循环即可。
由于采用暴力解法,代码些许冗长,可能会有一些简便算法,欢迎指导讨论。

AC代码
#include
#include
#include
using namespace std;
struct Dot
{
     
	int x;
	int y;
	char type;
	int local;//位置
};
bool compare(Dot a,Dot b)
{
     
	return a.local<b.local;
}
int main()
{
     
	int n,m;
	cin>>n>>m;
	Dot d[n];
	for(int i=0;i<n;i++)
		scanf("%d %d %c",&d[i].x,&d[i].y,&d[i].type);
	sort(d,d+n,compare);
	int s0,s1,s2;
	while(m--)
	{
     
		cin>>s0>>s1>>s2;
		for(int i=0;i<n;i++)
		{
     
			int l=s0+s1*d[i].x+s2*d[i].y;
			if(l>0)
				d[i].local=1;
			else
				d[i].local=0;
		}
		sort(d,d+n,compare);
		bool flag=1;
		for(int i=1;i<n;i++)
		{
     
			if(d[i].local==d[i-1].local)
			{
     
				if(d[i].type!=d[i-1].type)
				{
     
					flag=0;
					break;
				}
			}
		}
		if(flag)
			cout<<"Yes\n";
		else
			cout<<"No\n";
	}
	return 0;
} 

你可能感兴趣的:(数据结构,算法,c++,csp,c语言)