CSP练题 202006-1

题目链接:CSP 202006-1线性分类器

满分代码:

#include<iostream>
#include<vector>
#define N 1000
using namespace std;

typedef struct{
	int x;
	int y;
	char type;
}Point;
typedef struct{
	int a;
	int b;
	int c;
	string pos;
}Line;

int main(){
	int n,m;
	cin >> n >> m;
	vector<Point> pa,pb;
	vector<Line> line;
	for(int i=0;i<n;i++){
		Point p;
		cin >> p.x >> p.y >> p.type;
		if(p.type=='A') pa.push_back(p);
		else pb.push_back(p);
	} 
	for(int j=0;j<m;j++){
		Line l;
		int flag=0;
		cin >> l.a >> l.b >> l.c;
		int counta=0,countb=0; 
		/*先判断A类点(B类也可以)  
		总体想法就是先分类,然后归类 一类点在上方或是下方,然后在接着判断 */ 
		for(int k=0;k<pa.size();k++){
			if(!flag){
				//说明A类点在上方 
				if(l.a+l.b*pa[k].x+l.c*pa[k].y>0) counta++;
				else{
					flag=1;
					counta++;
				} 
			}else{
				//说明A类点在下方 
				if(l.a+l.b*pa[k].x+l.c*pa[k].y<0) counta++;
			}
		}
		//当A类点全属于上/下方时,才判断B类点 
		if(counta==pa.size()){
			for(int j=0;j<pb.size();j++){
				//如果flag为1  则B在上方 
				if(flag){
					if(l.a+l.b*pb[j].x+l.c*pb[j].y>0) countb++;
				} else{
					if(l.a+l.b*pb[j].x+l.c*pb[j].y<0) countb++;
				}
			}
		} 
		
		if(countb==pb.size()){
			l.pos="Yes";
		}else{
			l.pos="No";
		}
		line.push_back(l);
	}
	
	for(int i=0;i<line.size();i++){
		cout << line[i].pos << endl; 
	}
	
	return 0;
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值