打卡信奥刷题(1145)用C++实现信奥 P2073 送花

P2073 送花

题目背景

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

题目描述

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

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

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

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

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

输入格式

若干行,每行一个操作,以 − 1 -1 1 结束。

输出格式

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

输入输出样例 #1

输入 #1

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

输出 #1

8 5

说明/提示

设操作数为 m m m

  • 对于 20 % 20\% 20% 数据, m ≤ 100 m \le 100 m100 1 ≤ W , C ≤ 1 0 3 1\le W,C\le 10^3 1W,C103
  • 对于全部数据, m ≤ 1 0 5 m \le 10^5 m105 1 ≤ W , C ≤ 1 0 6 1\le W,C\le 10^6 1W,C106

C++实现

#include
#define lol long long
#define il inline
#define rg register
#define Min(a,b) (a)<(b)?(a):(b)
#define Max(a,b) (a)>(b)?(a):(b)
using namespace std;
const int N=1e5+10;
void in(lol &ans){
    ans=0; lol f=1; char i=getchar();
    while(i<'0' || i>'9') {if(i=='-') f=-1; i=getchar();}
    while(i>='0' && i<='9') ans=(ans<<1)+(ans<<3)+i-'0', i=getchar();
    ans*=f;
}
struct node {
    lol x,v;
    bool operator < (const node & a) const {return v<a.v;}
};
set<node>v;
int main(){
    lol op,x,y; node tmp;
    while(1) {
        in(op);
        if(op==1) {
            in(x),in(y);
            tmp = (node) {x,y};
            v.insert(tmp);
        }
        else if(op==2) {if(v.size()) v.erase(--v.end());}
        else if(op==3) {if(v.size()) v.erase(v.begin());}
        else {
            lol ans1=0,ans2=0;
            for(set<node>::iterator it=v.begin();it!=v.end();it++) 
				ans1+=(*it).x,ans2+=(*it).v;
            printf("%lld %lld\n",ans1,ans2);
            return 0;
        }
    }
    return 0;
}

打卡信奥刷题(1145)用C++实现信奥 P2073 送花_第1张图片

后续

接下来我会不断用C++来实现信奥比赛中的算法题、GESP考级编程题实现、白名单赛事考题实现,记录日常的编程生活、比赛心得,感兴趣的请关注,我后续将继续分享相关内容

你可能感兴趣的:(C++,c++,开发语言,算法,青少年编程,数据结构)