P2073

送花

题目背景

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

题目描述

这些花都很漂亮,每朵花有一个美丽值 \(W\),价格为 \(C\)

小明一开始有一个空的花束,他不断地向里面添加花。他有以下几种操作:

  • \(1\ W\ C\):添加一朵美丽值为 \(W\),价格为 \(C\) 的花。
    如果此时花束中已经有了相等价格的花,那么这朵花不能加入花束。
  • \(2\):删除当前花束里最贵的一朵花。
  • \(3\):删除当前花束里最便宜的一朵花。
  • \(-1\):完成添加与删除,开始包装花束。

当花束为空时,忽略操作 \(2\)\(3\)

请你写一个程序,计算出开始包装花束时,花束中所有花的美丽值的总和,以及小明需要为花束付出的总价格。

输入格式

若干行,每行一个操作,以 \(-1\) 结束。

输出格式

一行,两个空格隔开的正整数表示开始包装花束时,花束中所有花的美丽值的总和。以及小明需要为花束付出的总价格。

样例 #1

样例输入 #1

1 1 1
1 2 5
2
1 3 3
3
1 5 2
-1

样例输出 #1

8 5

提示

设操作数为 \(m\)

-对于 \(20\%\) 数据,\(m \le 100\)\(1\le W,C\le 10^3\)
-对于全部数据,\(m \le 10^5\)\(1\le W,C\le 10^6\)

对于最大最小就用set Kth就用pbds
注意set结构体时 要自己定义operator <
将需要排序(同时也是需要去重)的关键字定义<
bool operator < (const did&a )const{return c<a.c}
注意写法
注意STL的end()是一个空迭代器 没有指向值 所以要--
点击查看代码
#include<bits/stdc++.h>
using namespace std;
struct did{
	int w,c;
	bool operator < (const did &a)const
	{
		return c<a.c;
	}
};
set<did>st;
int m,op,w,c;
int main()
{
	ios::sync_with_stdio(false);
	while(cin>>op)
	{
		if(op==-1)break;
		m++;
		if(op==1)
		{
			cin>>w>>c;
			did z;
			z.w=w,z.c=c;
			st.insert(z);
		}
		if(op==2)
		{
			if(st.size()>0)st.erase(--st.end());
		}
		if(op==3)
		{
			if(st.size()>0)st.erase(st.begin());
		}
	}
	set<did>::iterator it;
	int tot1=0,tot2=0;
	for(it=st.begin();it!=st.end();it++)
		tot1+=(*it).w,tot2+=(*it).c;
	cout<<tot1<<" "<<tot2<<"\n";
	return 0;
}
posted @ 2023-01-19 20:32  PKU_IMCOMING  阅读(7)  评论(0)    收藏  举报