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;
}
此生无悔入OI 来生AK IOI

浙公网安备 33010602011771号