CSP-202006-1-线性分类器

线性分类器(传送门)

长时间不写,有点手生,写了老半天

样例输入

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

样例输出

No
No
Yes

满分代码

#include <bits/stdc++.h>

using namespace std;

long n;
int m;

struct pos{
    
    
	int x;//横坐标 
	int y;//纵坐标 
	int v;//每个点所在每条直线的上下,1表示上,-1表示下 
	int type;//分类点,0表示A,1表示B 
}a[1001];


int main(){
    
    
	
	cin >> n >> m;
	int x,y;
	char c;
	
	for (int i = 0; i < n; i++) {
    
    
		cin >> x >> y >> c;
		a[i].x = x;
		a[i].y = y;
		if(c == 'A') {
    
    
			a[i].type = 0;
		}else if(c == 'B') {
    
    
			a[i].type = 1;
		}
	}
	
	int v1,v2,v3;//输入的直线的三个参数 
	vector<string> vec;//输出结果存储 
	
	for(int i = 0; i < m; i++){
    
    
		cin >> v1 >> v2 >> v3;
		for (int j = 0; j < n; j++) {
    
    
			int v = v1 + v2*a[j].x + v3*a[j].y;//计算结果 
			a[j].v = v/abs(v);	//将在直线上面还是下面填入 
		}
		
		// c,d表示A,B现有的总数
		// c1,d1表示在直线上或者下面的总和 
		//当A、B分类符合题目要求,则c与c1的绝对值相等,d与d1的绝对值相等 
		int c = 0,c1 = 0; 
		int d = 0,d1 = 0;
		
		for(int j = 0; j < n; j++) {
    
    
			if(a[j].type == 0) {
    
    
				c1++;
				c += a[j].v;
			} else if(a[j].type == 1) {
    
    
				d1++;
				d += a[j].v;
			}
		}
		
		//最后的判断条件 
		if(abs(c) == c1 && abs(d) == d1) {
    
    
			vec.push_back("Yes");
		} else {
    
    
			vec.push_back("No");
		}
	}
	
	// 输出结果 
	for(int i = 0; i < vec.size(); i++) {
    
    
		cout << vec[i] << endl;
	}
	
	
	
	return 0;
}

这里是题目O(∩_∩)O,欢迎大家留言,有空的话可以点个赞哦(#^ . ^#)

       试题编号:
202006-1
试题名称: 线性分类器
时间限制: 1.0s
内存限制: 512.0MB
问题描述: 在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_44635198/article/details/108416660