ccf 201909-4 推薦系統(100分)

 

 

提交後得100分的C++程序如下:

#include<iostream>
#include<set>
#include<vector>
using namespace std;
struct good
{
	int type;
	int id;
	int score;
	good(int t,int i,int s)
	{
		type=t;
		id=i;
		score=s;
	}
	bool operator<(const good &s) const
	{
		if(score==s.score){
			if(type==s.type)
			{
				return id<s.id;
			}
			else{
				return type<s.type;
			}
		}
		return score>s.score;
	}
};
struct delgood //要刪除的商品 
{
	int type;
	int id;
	delgood(int t,int i){
		type=t;
		id=i;
	}
	bool operator<(const delgood &s) const
	{
		if(type==s.type){
			return id<s.id;
		}
		return type<s.type;
	}
};
set<good> s;
set<delgood> d;
vector<int> v[51];//保存每類要輸出的商品編號 
int cnt[51],sum;
int main()
{
	int m,n,id,score;
	cin>>m>>n;
    for(int i=0;i<n;i++)
    {
    	cin>>id>>score;
    	for(int j=0;j<m;j++)
    	{
    	  s.insert(good(j,id,score));
		 } 
	}
	int ask,op;
	cin>>ask;
	while(ask--)
	{
		cin>>op;
		if(op==1)
		{
			int type,id,score;
			cin>>type>>id>>score;
			s.insert(good(type,id,score));
		}
		else if(op==2)
		{
			int type,id;
			cin>>type>>id;
			d.insert(delgood(type,id));
		}
		else{
			cin>>sum;
			for(int i=0;i<m;i++)
			{
				cin>>cnt[i];
				v[i].clear();
			}
			for(set<good>::iterator it=s.begin();it!=s.end()&&sum>0;)
			{
				if(cnt[(*it).type]>0){
					if(d.find(delgood((*it).type,(*it).id))!=d.end()) //被刪除了 
					{
						s.erase(it++);
					 } 
					 else
					 {
					 	v[(*it).type].push_back((*it).id);
					 	sum--,cnt[(*it).type]--;
					 	it++;
					 }
				}
				else it++;
			}
			for(int i=0;i<m;i++)
			{
				if(v[i].size()==0)
				{
					cout<<-1<<"\n";
					continue;
				}
			for(vector<int>::iterator it=v[i].begin();it!=v[i].end();it++)
			{
				cout<<(*it)<<" ";
			}
			cout<<"\n";
		}
		}
	}
	return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章