【CSP CCF记录】202006-1 线性分类器

题目

 

过程

第一次提交

运行结果错误,但是在dev c++中运行正确,暂未找到原因,记录一下。

#include<bits/stdc++.h>
using namespace std; 
int n,m;
int X[110],Y[110];
char T[110];
string result[22];
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		cin>>X[i]>>Y[i]>>T[i];
	}
	for(int i=1;i<=m;i++)
	{
		long long theta0,theta1,theta2;
		cin>>theta0>>theta1>>theta2;
		int pa=0,pb=0,p=0;
		for(int j=1;j<=n;j++)
		{
			if(T[j]=='A')
			{
				//cout<<theta0+theta1*X[j]+theta2*Y[j]<<endl;
				 
				if(theta0+theta1*X[j]+theta2*Y[j]>=0)
				{
					if(pa==2)
					{
						//cout<<"No"<<endl;
						result[i]="No";
						p=1;
						break;
					}
					pa=1;
				}
				else
				{
					if(pa==1)
					{
						//cout<<"No"<<endl;
						result[i]="No";
						p=1;
						break;
					}
					pa=2;
				}
			}
			else if(T[j]=='B')
			{
				
				if(theta0+theta1*X[j]+theta2*Y[j]>=0)
				{
					if(pb==2)
					{
						//cout<<"No"<<endl;
						result[i]="No";
						p=1;
						break;
					}
					pb=1;
				}
				else
				{
					if(pb==1)
					{
						//cout<<"No"<<endl;
						result[i]="No";
						p=1;
						break;
					}
					pa=2;
				}
			}
		}
		if(p==0)
		//cout<<"Yes"<<endl;
		result[i]="Yes";
	}
	for(int i=1;i<=m;i++)cout<<result[i]<<endl;
	return 0;	
}

第二次提交

参考:http://t.csdnimg.cn/S6XxS

把点坐标代入直线方程判断点再直线哪一侧。对于每一个直线方程,判断过程如下:

记录下每个点的信息,判断的时候先计算第一个点位于直线哪一侧,再看剩余的点是否和第一个点同类别:

  • 如果同类别,那么该点应该和第一个点在直线同一边。若不是,返回false。
  • 如果不同类别,那么该店应该和第一个点在不同侧。若不是,返回false。

输入样例:

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
#include<bits/stdc++.h>
using namespace std; 
const int maxn=1010;
int n,m;
struct point{
	int x,y;
	char type;
}points[maxn];
long long theta0,theta1,theta2;
bool solve()
{
	int i=0;
	long long res=theta0+theta1*points[i].x+theta2*points[i].y;
	for(int i=1;i<n;i++)
	{
		long long res1=theta0+theta1*points[i].x+theta2*points[i].y;
		if(points[i].type==points[0].type)
		{
			if(res*res1<0)return false;
		}
		else{
			if(res*res1>0)return false;
		}
	}
	return true;
}
int main()
{
	cin>>n>>m;
	int x,y;
	char type;
	for(int i=0;i<n;i++)
	{
		cin>>points[i].x>>points[i].y>>points[i].type;
	}
	for(int i=0;i<m;i++)
	{
		
		cin>>theta0>>theta1>>theta2;
		if(solve())
		cout<<"Yes"<<endl;
		else cout<<"No"<<endl;
    }
	return 0;	
}

结果

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值