CCF 2020-6-1-线性分类器

/*
输入:n m      点的个数   查询的个数
	  2--n+1行输入n个点的信息(x,y,A)
	  n+2--n+m+1行输入m个查询
输出:m行,每行一个字符串:Yes  No
 
*/ 
#include<stdio.h>
int x[10001],y[10001]; 
char c[10001];
int main()
{
	int n,m,i,j,sum;
	int A,B;                   //标记是否可以划分 
	int a0,a1,a2; 

	scanf("%d%d",&n,&m);
	 
	for(i=0;i<n;i++)
	{
		scanf("%d%d %c",&x[i],&y[i],&c[i]);	
    } 
    for(i=0;i<m;i++)
	{
		scanf("%d%d%d",&a0,&a1,&a2);
		if(c[0]=='A')              //由第一个点来标定A,B分别在直线的上方还是下方 
		{                          //1为上方,-1为下方(用字符A,B更方便) 
			if(a0+a1*x[0]+a2*y[0]>0)
			{
				A=1,B=-1;
			 } 
			 else
			 {
			 	A=-1,B=1;
			 }
		}
		else
		{
			if(a0+a1*x[0]+a2*y[0]>0)
			{
				A=-1,B=1;
			 } 
			 else
			 {
			 	A=1,B=-1;
			 }
		}
		sum=1;               //符合分类的点数
		for(j=1;j<n;j++)     //下标为0的点已经判断过了 
		{
			if(c[j]=='A')
			{
				if(((a0+a1*x[j]+a2*y[j])*A)>0)  //A已经有了确定的值,要么1要么-1,  
					sum++;                      //乘积为正,只能是1*1,-1*(-1) 
				else                            //说明,这种情况下是符合划分的。 
					break;
			}
			else if(c[j]=='B')
			{
				if(((a0+a1*x[j]+a2*y[j])*B)>0)
				{
					sum++;
				}
				else
				{
					break;
				}
			}
		
		} 	
    
    	if(n==sum)
			printf("Yes\n");
		else
			printf("No\n");
    }	
    return 0;
}

 这道题真的没有想出什么好的方法,可以说完全参考了这篇博客:

明天再做详细的解体说明吧。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值