202006-1 线性分类器

简单题:

  唯一需要注意的就是我们不能只判断一种点,需要两种点都进行判断,否则会出现A点在一侧,B点在两侧的情况

 

/*线性分类器*/
#include<bits/stdc++.h>
#include<vector>
using namespace std;
struct node
{
    int x,y;
};
vector<node> A;
vector<node> B;
bool just(int a,int b,int c)
{
    int line=a*A[0].x+b*A[0].y+c;
    if(line>0){
        for(int i=0;i<A.size();i++){
            int temp=a*A[i].x+b*A[i].y+c;
            if(temp<0){
                return false;
            }
        }
        for(int i=0;i<B.size();i++){
            int temp=a*B[i].x+b*B[i].y+c;
            if(temp>0){
                return false;
            }
        }
    }
    if(line<0){
        for(int i=0;i<A.size();i++){
            int temp=a*A[i].x+b*A[i].y+c;
            if(temp>0){
                return false;
            }
        }
        for(int i=0;i<B.size();i++){
            int temp=a*B[i].x+b*B[i].y+c;
            if(temp<0){
                return false;
            }
        }
    }
    return true;
}
int main()
{
    int n,m;
    cin>>n>>m;
    for(int i=0;i<n;i++){
        node temp;
        char c;
        cin>>temp.x>>temp.y>>c;
        if(c=='A'){
            A.push_back(temp);
        }
        else{
            B.push_back(temp);
        }
    }
    for (int i = 0; i < m; i++){
        int a,b,c;
        cin>>c>>a>>b;
        if(just(a,b,c)){
            cout<<"Yes"<<endl;
        }
        else{
            cout<<"No"<<endl;
        }
    }
    
}

 

posted @ 2021-03-27 21:20  南理工学渣  阅读(70)  评论(0)    收藏  举报