P2073 送花

题目背景

小明准备给小万送一束花,以表达他对小万的爱意。他在花店看中了一些花,准备用它们包成花束。

题目描述

这些花都很漂亮,每朵花有一个美丽值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;
}
原文地址:https://www.cnblogs.com/bangdexuanyuan/p/13978861.html