CCF CSP 2020年 1题线性分类器

题意:

给你二维坐标上的一些点,给这些点分为两类A类 和 B类 然后给你一
条直线的公式。判断这条直线是否能把A类点和B类点完美分开。

解:

这道题不难,看到这道题我竟然想起了久违的机器学习(笑哭滑稽)。
我的解法也不算太简单,主要的是想给大家展示for_each算法的返回值
的使用。废话不多说了上代码!!!

c++代码:

#include 
#include 
#include 

using namespace std;
struct Test 
{
     
public:
    vector<int> t;
    bool ttgz = true,ttlz = true;//两个检查
    Test(vector<int> t):t(t)
    {
     

    }
    void operator() (pair<int, int>& a)//重载()仿函数
    {
     
        int tt = t[0] + t[1] * a.first + t[2] * a.second;
        if (tt > 0)
        {
     
            ttlz = false;
        }
        else if (tt < 0)
        {
     
            ttgz = false;
        }
    }
};


int main()
{
     
    vector<pair<int, int> > A; vector<pair<int, int> > B;
    vector<vector<int> > I;//容器里面可以存放容器(像极了俄罗斯套娃哈哈!!)
    int m, n;
    cin >> m >> n;

    while (m--)
    {
     
        int a, b; char c;
        cin >> a >> b >> c;
        if (c == 'A')
        {
     
            A.push_back(pair<int,int>(a,b));
        }
        else
        {
     
            B.push_back(pair<int, int>(a, b));
        }
    }

    while (n--)
    {
     
        int a, b, c;
        vector<int> T;
        cin >> a >> b >> c;
        T.push_back(a); T.push_back(b); T.push_back(c);
        I.push_back(T);
    }

    for (vector<vector<int> >::iterator it = I.begin(); it != I.end(); it++)
    {
     
        Test A1 = for_each(A.begin(), A.end(), Test(*it));//这行就开始使用了for_each算法的返回值。她的返回值是Test类的最终的状态。然后检查里面的bool值
        if ((A1.ttgz && !A1.ttlz) || (!A1.ttgz && A1.ttlz))
        {
     
            Test B1 = for_each(B.begin(), B.end(), Test(*it));//同理
            if ((A1.ttgz && B1.ttlz) || (A1.ttlz && B1.ttgz))
            {
     
                cout << "Yes" << endl;
            }
            else
            {
     
                cout << "No" << endl;
            }
        }
        else
        {
     
            cout << "No" << endl;
        }
    }
    return 0;
}


最后当然是完美的收官啦!!
最后的截图
欢迎交流!QQ:1364388975

你可能感兴趣的:(ccf,c++,算法)