CCF 202006-1 线性分类器 100分 31ms

点击前往试题目录:https://blog.csdn.net/best335/article/details/99550556

在这里插入图片描述
题目废话太多,简化如下。

题意

在二维坐标系上有n个点,每个点有两种类型A或B。给定一条线 p1+p2x+p3y=0,问这条线是否能把平面上所有的点分为A、B两部分。

输入

第一行两个数:点的个数n,及查询的次数m
接下来n行,每行3个数,代表点的x轴位置,y轴位置,以及点的类型type。
接下来m行,每行3个数,代表线的三个参数。

输出

输出m行,对应m次查询。
若可分割两区域,输出"Yes",否则输出"No"。

解题思路

设 r = p1+p2x+p3y,只需要判断所有的rA、rB异号,且均!=0。

AC代码 c++11

#include<iostream>
#include<unordered_map>
#include<vector>
using namespace std;
int p1,p2,p3;
bool err;
int calc( unordered_map<int,vector<int> >& m){
	if(err) return 0;
	int flag = 0;
	for(unordered_map<int,vector<int> >::iterator itX = m.begin();itX!=m.end();++itX){
		const int &x = itX->first;
		const vector<int> &ys = itX->second;
		for(int i=0,ni=ys.size();i<ni;++i){
			const int &y = ys[i];
			int r = p1+p2*x+p3*y;
			if(r!=0){
				if(flag==0) flag = r;
				else if(flag>0&&r<0||flag<0&&r>0) {
					err = true;
					return flag;
				}
			}
		}
	}
	if(flag == 0) err=true;
	return flag;
}

int main(){
	int n,m,x,y;
	char type;
	unordered_map<int,vector<int> > A,B;
	cin>>n>>m;
	for(int i=0;i<n;++i){
		cin>>x>>y>>type;
		if(type=='A'){
			A[x].push_back(y);
			continue;
		}
		B[x].push_back(y);
	}
	for(int i=0;i<m;++i){
		cin>>p1>>p2>>p3,err=false;
		cout<<(calc(A)!=calc(B)&&!err?"Yes":"No")<<endl;
	}
	return 0;
}

测试样例

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
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值