CCF CSP试题编号: 202006-1试题名称: 线性分类器

#include <bits/stdc++.h>
using namespace std;
struct pot{
	double x;
	double y;
	char type;
};
int main(){
	int n,m;
	cin>>n>>m;
	pot pos[10010];
	for(int i=1;i<=n;i++){
		cin>>pos[i].x>>pos[i].y>>pos[i].type;
	}
	while(m--){
		//c+ax+by=0;
		double c,a,b;
		cin>>c>>a>>b;
		double stdy=0;
		int flaga;//标记大于还是小于 
		int Ard=0;//标记第一个A,作为A的基准
		
		int flagb;
		int Brd=0;
		
		int noflag=0;//是否有no输出
		for(int i=1;i<=n;i++){
		 stdy=(c+a*pos[i].x)/((-1)*b);//某个点x值对应分类线的y
		 
		 if(pos[i].type=='A'){ 
			if(Ard==0){
			 	if(pos[i].y>stdy){
					flaga=1;//标记大于,即第一个A的y在分类线之上,以后的A都应如此
					Ard=1;
					}
				else if(pos[i].y<stdy){
					flaga=0;//标记小于
					Ard=1;	
					}
				 }
			if(Ard!=0){
				if(flaga==1&&pos[i].y<stdy){
					cout<<"No"<<endl;
					noflag=1;
					break;
				}
				if(flaga==0&&pos[i].y>stdy){
					cout<<"No"<<endl;
					noflag=1;
					break;
				}
			}
		}//------------------------B与A同理 简单复刻一下即可
		if(pos[i].type=='B'){ 
			if(Brd==0){
			 	if(pos[i].y>stdy){
					flagb=1;//标记大于
					Brd=1;
					}
				else if(pos[i].y<stdy){
					flagb=0;//标记小于
					Brd=1;	
					}
				 }
			if(Brd!=0){
				if(flagb==1&&pos[i].y<stdy){
					cout<<"No"<<endl;
					noflag=1;
					break;
				}
				if(flagb==0&&pos[i].y>stdy){
					cout<<"No"<<endl;
					noflag=1;
					break;
				}
			}
		}
		 
		}		
		if(noflag==0)cout<<"Yes"<<endl;
	}
	
}

  • 6
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值