CCF CSP 2020.06_1_线性分类器_C++
- 题目描述:
- 解题思路:
- 思路一(暴力破解法):
- 代码实现
- 代码实现(暴力破解法):
题目描述:
解题思路:
思路一(暴力破解法):
1、解此类题目分为两部分:
①读入数据(n+m+1):
(1)输入n m(点、查询个数)
(n)输入n行 xi,yi,typei
(m)输入m行 a1,a2,a3
② 处理数据,解决问题
A分类:计算 a0+a1x+a2y 判断其是否大于0,记录在bool数组 A 中。
B分类:计算 a0+a1x+a2y 判断其是否大于0,记录在bool数组 B 中。
在同一分类中,如果 a0+a1x+a2y 都为 true 或 false ,并且 不同分类中 分别存储false和true,则输出 YES,否则输出 NO。
代码实现
代码实现(暴力破解法):
#include <iostream>
#include <vector>
using namespace std;int main(int argc, char const *argv[]) {// 读取n(点的数量)和m(查询的数量)int n, m;cin >> n >> m;// 定义数组 x, y, type 用来存储每个点的坐标和类别int x[n], y[n];char type[n];// 读取n个点的坐标和类别for (int i = 0; i < n; i++) {cin >> x[i] >> y[i] >> type[i]; // 输入每个点的坐标 (x[i], y[i]) 和类别 (type[i]: 'A' 或 'B')}// 定义数组 a0, a1, a2 用来存储每次查询的系数int a0[m], a1[m], a2[m];// 读取m组查询的参数,a0[i], a1[i], a2[i]分别是每组查询的系数for (int i = 0; i < m; i++) {cin >> a0[i] >> a1[i] >> a2[i]; // 输入每次查询的系数 (a0[i], a1[i], a2[i])}// 针对每个查询,判断是否能够完美分割A类和B类点for (int i = 0; i < m; i++) {vector<bool> A; // 存储类别A点的判断结果 (每个A类点是否满足超平面条件)vector<bool> B; // 存储类别B点的判断结果 (每个B类点是否满足超平面条件)// 针对每个点,计算表达式值,并根据值决定其属于A类还是B类for (int j = 0; j < n; j++) {// 对于类别A的点,判断表达式 a0[i] + a1[i]*x[j] + a2[i]*y[j] 是否大于0// 将判断结果存储在A中int value = a0[i] + a1[i] * x[j] + a2[i] * y[j];if (type[j] == 'A') {A.push_back(value > 0); // 如果A类点的值大于0,认为它符合该超平面条件} // 对于类别B的点,做同样的判断,结果存储在B中else {B.push_back(value > 0); // 如果B类点的值大于0,认为它符合该超平面条件}}int flag = 0; // flag 用于标识是否存在不一致的情况(如果有不一致,flag置为1)// 检查A中的所有值是否一致for (int i = 1; i < A.size(); i++) {if (A[i] != A[i - 1]) { // 如果A类点中存在不一致的判断,说明它们无法被同一个超平面分割flag = 1; // 设置标志为1,表示存在不一致break;}}// 如果A类的判断一致,检查B类中的所有值是否一致if (flag == 0) {for (int i = 1; i < B.size(); i++) {if (B[i] != B[i - 1]) { // 如果B类点中存在不一致的判断,说明它们无法被同一个超平面分割flag = 1; // 设置标志为1,表示存在不一致break;}}}// 如果A类和B类的判断结果都一致,且A类的判断与B类不冲突,则输出"YES",否则输出"NO"if (flag == 0 && A[0] != B[0]) {cout << "YES" << endl; // 说明可以找到一个超平面将A类和B类完全分割} else {cout << "NO" << endl; // 否则说明无法找到符合条件的超平面}}return 0;
}
欢迎大家和我沟通交流(✿◠‿◠)