题目背景
小明准备给小红送一束花,以表达他对小红的爱意。他在花店看中了一些花,准备用它们包成花束。
题目描述
这些花都很漂亮,每朵花有一个美丽值W,价格为C。
小明一开始有一个空的花束,他不断地向里面添加花。他有以下几种操作:
操作 含义
1 W C 添加一朵美丽值为W,价格为C的花。
3 小明觉得当前花束中最便宜的一朵花太廉价,不适合送给小红,所以删除最便宜的一朵花。
2 小明觉得当前花束中最贵的一朵花太贵,他心疼自己的钱,所以删除最贵的一朵花。
-1 完成添加与删除,开始包装花束
若删除操作时没有花,则跳过删除操作。
如果加入的花朵价格已经与花束中已有花朵价格重复,则这一朵花不能加入花束。
请你帮小明写一个程序,计算出开始包装花束时,花束中所有花的美丽值的总和,以及小明需要为花束付出的总价格。
输入输出格式
输入格式:若干行,每行一个操作,以-1结束。
输出格式:一行,两个空格隔开的正整数表示开始包装花束时,花束中所有花的美丽值的总和。以及小明需要为花束付出的总价格。
输入输出样例
输入样例#1:
1 1 1 1 2 5 2 1 3 3 3 1 5 2 -1
输出样例#1:
8 5
说明
对于20%数据,操作数<=100,1<=W,C<=1000。
对于全部数据,操作数<=100000,1<=W,C<=1000000。
/* 两个优先队列模拟 */ #include<iostream> #include<cstdio> #include<queue> #include<vector> using namespace std; int v[1000010],ans1,ans2; priority_queue<int>q1; priority_queue<int,vector<int>,greater<int> >q2; int main(){ int x,y,z; while(1){ scanf("%d",&x); if(x==1){ scanf("%d%d",&y,&z);//mei li zhi,jia ge if(!v[z]){ v[z]=y; ans1+=y;ans2+=z; q1.push(z);q2.push(z); } } if(x==2){//删最贵的一朵花 while(!q1.empty()&&!v[q1.top()])q1.pop(); if(!q1.empty()){ ans1-=v[q1.top()]; ans2-=q1.top(); v[q1.top()]=0; q1.pop(); } } if(x==3){//删最便宜的一朵花 while(!q2.empty()&&!v[q2.top()])q2.pop(); if(!q2.empty()){ ans1-=v[q2.top()]; ans2-=q2.top(); v[q2.top()]=0; q2.pop(); } } if(x==-1){ break; } } cout<<ans1<<' '<<ans2; }