ccfcsp2020-6-1线性分类器(满分c++题解)

该题是第一题,相当于打卡题,比较简单,我在代码中的备注也很清楚。

该题主要考察的就是怎么判断一个点和直线的关系,该题就是点在直线的下面还是上面(题中说了不可能刚好点在直线上)直线:ax+by+k=0;判断点(x0,y0),把(x0,y0)带入ax+by+k=sum,判断sum的正负,如果所有点的sum都>0或者小于0就说明在一侧,先判断A的sum,如果sum>0那么B应该是sum<0,反之如此,这样才是合法的。

下面是代码:

#include<iostream>
#include<vector>
using namespace std;
int main()
{
	int n,m;
	cin>>n>>m;
	vector<pair<int,int>> A;
	vector<pair<int,int>> B;
	for(int i=0;i<n;++i)
	{
		int temp1,temp2;
		char type;
		cin>>temp1>>temp2>>type;
		if(type=='A')//选择压入哪一个容器
			A.push_back(make_pair(temp1,temp2));
		else if(type=='B')
			B.push_back(make_pair(temp1,temp2));
	}
	for(int i=0;i<m;++i)
	{
		int k,a,b;//k+ax+by=0
		cin>>k>>a>>b;
		bool flag=false;// -
		//A 
		long long temp=a*A[0].first+b*A[0].second+k;//查看第一个的值的正负,判断在直线上面还是下面,后面的如果不同,就说明没有完全划分好A B
		if(temp>0)
			flag=true;
		bool is_legal=true;	//判断A中是否都在直线的一侧
		for(int j=1;j<A.size();++j)
		{
			long long sum=a*A[j].first+b*A[j].second+k;
			if((sum >0 && !flag )||(sum<0 && flag))//如果和第一项不在同一侧,说明不合法
			{
				is_legal=false;
				break;
			}
		}
		if(is_legal==false)
		{
			cout<<"No"<<endl;
			continue;
		}
		//B 
		long long tempB=a*B[0].first+b*B[0].second+k;//查看B的第一项在直线的哪里 
		flag=!flag;//与A相反 + false 
		bool is_legal2=true;
		for(int j=1;j<B.size();++j)
		{
			long long sum=a*B[j].first+b*B[j].second+k;//如果和第一项不在同一侧,说明不合法
			if((sum >0 && !flag) || (sum<0 && flag))
			{
				is_legal2=false;
				break;
			}	
		}
		if(is_legal2==false)
		{
			cout<<"No"<<endl;
			continue;		
		}//最后就是正确的直线
		cout<<"Yes"<<endl;	
	}	
} 

下面是截图:

  • 9
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值