CSP:线性分类器

csp:线性分类器;满分实例代码;

// csp2016_线性分类器.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
#include <iostream>
#include<algorithm>
using namespace std;
struct point {
    
    
	int x;
	int y;
	char z;
};
struct line
{
    
    
	int c;
	int a;
	int b;
};
int main()
{
    
    
	int n, m;
	cin >> n >> m;
	point *point1 = new point[n];
	line *line1 = new line[m];
	for (int i = 0; i < n; i++) {
    
    
		int x1; int y1; char z1;
		cin >> x1 >> y1 >> z1;
		point1[i].x = x1;
		point1[i].y = y1;
		point1[i].z = z1;
	}
	for (int j = 0; j < m; j++) {
    
    
		int c1, a1, b1;
		cin >> c1 >> a1 >> b1;
		line1[j].c = c1;
		line1[j].a = a1;
		line1[j].b = b1;
	}
	int *flagA = new int[m]();
	int *flagB = new int[m]();
	for (int i = 0; i < m; i++) {
    
    
		int *aA = new int[1001]();
		int *bB = new int[1001]();
		for (int j = 0; j < n; j++) {
    
    			
			if (point1[j].z == 'A') {
    
    
				flagA[i] += 1;
				aA[flagA[i]] = line1[i].c + line1[i].a*point1[j].x + point1[j].y*line1[i].b;
			}
			else if(point1[j].z=='B')
			{
    
    
				flagB[i] += 1;
				bB[flagB[i]] = line1[i].c + line1[i].a*point1[j].x + point1[j].y*line1[i].b;
			}
			
		}
		sort(aA+1, aA + flagA[i] + 1);
		sort(bB+1, bB + flagB[i] + 1);
		if (aA[1] > 0  && bB[flagB[i]] < 0 || aA[flagA[i]] <0 &&bB[1] > 0 )
		{
    
    			
				cout << "Yes" << endl;		
		}
		else
		{
    
    
			cout << "No" << endl;
		}
	}
	return 0;
	//1.A类点不是同符号序列;2.A类点是同符号,B类也是同符号,但是A,B位于一侧;3.A,B位于两侧;
}
/*
方便测试,数据集如下:
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
*/
/*
4 1
1 1 A
2 2 A
1 1 B
2 2 B
1 1 1
*/

猜你喜欢

转载自blog.csdn.net/weixin_44627672/article/details/108556218
今日推荐