题目背景
小明准备给小万送一束花,以表达他对小万的爱意。他在花店看中了一些花,准备用它们包成花束。
题目描述
这些花都很漂亮,每朵花有一个美丽值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。
(set)容器
将其按照第二关键字进行排序
代码
#include<bits/stdc++.h>
using namespace std;
struct node{
long long b,a;
bool operator < (const node& w) const
{
return b<w.b;
} //自定义比较的类型
};
set<node> S;
int opt,k,q;
long long ans1,ans2;
int main()
{
while(scanf("%d",&opt),opt!=-1)
{
if(opt==1)
{
scanf("%d%d",&k,&q);
S.insert({q,k});
}
if(opt==2)
{
if(S.size()>=1)
S.erase(--S.end());
}
if(opt==3)
{
if(S.size()>=1)
S.erase(S.begin());
}
}
for(set<node>::iterator it=S.begin();it!=S.end();it++)//利用迭代器进行迭代
{
ans1+=(*it).b;
ans2+=(*it).a;
}
cout<<ans2<<' '<<ans1<<endl;
}