代码改变世界

CCF认证201909-4推荐系统

2019-11-30 16:21  -三余无梦生  阅读(279)  评论(0编辑  收藏  举报

 

#include <iostream>
#include <list>
#include <set>
#include <vector>
using namespace std;
int m, n;
int opask = 0;
class node {
public:
    int idm;
    long long id;
    long long score;
    node(int c, int a, int b) :idm(c), id(a), score(b) {}
};
class cmp {
public:
    bool operator()(node a, node b)
    {
        if (a.score == b.score)
        {
            if (a.idm == b.idm)
            {
                return a.id < b.id;
            }
            return a.idm < b.idm;
        }
        return a.score > b.score;
    }
};


int main()
{
    cin >> m >> n;
    set<node,cmp> li;
    set <int> del[55];
    //set<int> st[5005];
    vector<int> st[5005];
    for (int i = 0; i < n; i++)
    {
        int id, score;
        cin >> id >> score;
        for (int j = 0; j < m; j++)
            li.insert(node(j, id, score));
    }
    int opnum;
    cin >> opnum;
    for (int i = 0; i < opnum; i++)
    {
        int flag;
        cin >> flag;
        if (flag == 1)
        {
            int type, commodityid, score;
            cin >> type >> commodityid >> score;
            li.insert(node(type, commodityid, score));
        }
        else if (flag == 2)
        {
            int type, commodityid;
            cin >> type >> commodityid;
            del[type].insert(commodityid);
        }
        else if (flag == 3)
        {
            int k[55];
            for (int i = 0; i <= m; i++)
                cin >> k[i];
            int sum = 0;
            int max[55] = { 0 };
            for (auto i : li)
            {
                if (max[i.idm] < k[i.idm + 1] && sum < k[0] && del[i.idm].find(i.id) == del[i.idm].end())
                {
                    //st[opask*m + i.idm].insert(i.id);
                    st[opask*m + i.idm].push_back(i.id);
                    sum++;
                    max[i.idm]++;
                }
                if (sum >= k[0])
                    break;
            }
            opask++;
        }
    }


    for (int i = 0; i < opask*m; i++)
    {
        if (st[i].empty())
            cout << "-1" << endl;
        else
        {
            for (auto it : st[i])
                cout << it << " ";
            cout << endl;
        }
    }
    return 0;
}

起先用链表来存取商品信息,提交后发现时间超了,应该是查询商品时太慢,所以采用set来存取商品信息来提交,但提交后发现只得60分,原因如其他博客所说,应该是后台的数据有问题
,所以输出时不用对他的商品id进行排序就可,刚开始我是把信息存到set里直接就是排好序的,后来就直接有vector来存取,就可以了,注释的就是排序的结果,