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
*/