提交後得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;
}