ccfcsp认证 201909-4 推荐系统(set模拟)

题目描述:
ccfcsp认证 201909-4 推荐系统(set模拟)_第1张图片
ccfcsp认证 201909-4 推荐系统(set模拟)_第2张图片
ccfcsp认证 201909-4 推荐系统(set模拟)_第3张图片

思路:插入操作直接用set的insert即可,然后删除把map置为-1即可,(但是因为在set不删除那个商品,set里可能会有多个相同类且相同编号的商品,因为任何固定类的某个编号的商品是唯一的,所以用map记录每个商品的当前得分,如果set里有个同一编号的商品,跳过得分不是当前得分的商品),但是不考虑这一点也可以过。。 查询操作因为最多100个所以直接遍历即可。但是是60分,最后输出的时候不要排序,就100分了(我似乎没办法解释这一点,因为之前已经排过序了?)。

代码:

#include 

using namespace std;

struct node {
	int type , id , score;
	node(int a , int b , int c):type(a) , id(b) , score(c){}
	bool operator < (const node d) const {
		return score > d.score || (score == d.score && type < d.type) || (score == d.score && type == d.type && id < d.id);
	}
};

struct node1 {
	int type , id;
	node1(int a , int b):type(a) , id(b){}
	bool operator < (const node1 d) const {
		return type < d.type || (type == d.type && id < d.id);
	}
};

set  st;
map  mp;
int tp[100];

int main() {
	int m , n;
	ios::sync_with_stdio(0);
	cin.tie(0); cout.tie(0);
	cin >> m >> n;
	for(int i = 0 ; i < n ; i++) {
		int a , b;
		cin >> a >> b;
		for(int j = 0 ; j < m ; j++) {
			st.insert(node(j , a , b));
			mp[node1(j,a)] = b;
		}
	}
	int ops;
	cin >> ops;
	while(ops--) {
		int t;
		cin >> t;
		if(t == 1) {
			int a , b , c;
			cin >> a >> b >> c;
			st.insert(node(a , b , c));
			mp[node1(a,b)] = c;
		}
		else if(t == 2) {
			int a , b;
			cin >> a >> b;
			mp[node1(a,b)] = -1;
		}
		else {
			int k;
			cin >> k;
			vector  ans[100];
			for(int i = 0 ; i < m ; i++)cin >> tp[i];
			for(auto x = st.begin(); x != st.end() && k; x++) {
				node tmp = *x;
				node1 tmp1 = node1(tmp.type,tmp.id);
				if(!tp[tmp1.type] || mp[tmp1] != tmp.score)continue;
				tp[tmp1.type]--; k--;
				ans[tmp1.type].push_back(tmp1.id);
			}
			for(int i = 0 ; i < m ; i++) {
				if(!ans[i].size()) {
					cout << -1 <<"\n";
				}
				else {
					//sort(ans[i].begin() , ans[i].end());
					for(int j = 0 ; j < ans[i].size() ; j++) {
						if(j > 0)cout << " ";
						cout << ans[i][j];
					}
					cout << "\n";
				}
			} 
		}
	}
	return 0;
}

你可能感兴趣的:(ccf,模拟,stl)