map 中存储pair的排序实现

acwing 4951. 整理账本

账本中记录了一种产品的 n条买卖记录。

记录分为两种,格式如下:

  • B p q,表示以 p元/件的价格,买入 q 件该种商品。
  • S p q,表示以 p 元/件的价格,卖出 q 件该种商品。

任何卖出记录的交易价格都高于任何买入记录的交易价格。

也就是说,不会存在卖出记录和买入记录的交易价格相同的情况。

现在,请你对账本进行整理,对所有交易价格相同的记录进行合并,使得每个交易价格只存在一条记录,新记录的交易数量等于所有参与合并的旧记录的交易数量之和。

具体来说,如果账本中有 k 条记录的交易价格为 p,它们的交易数量分别为 q1,q2,…,qk,则将它们合并为一条新记录,新记录的交易价格仍为 p,交易数量为 q1+q2+…+qk。

注意:

  • 合并为新记录后,参与合并的旧记录就从帐本中抹除了。
  • 新纪录的交易类型(买入或卖出)保持不变,即与参与合并的旧记录保持一致。
  • 不会存在卖出记录和买入记录的交易价格相同的情况。

整理完毕后,对于现有的所有记录,请你找到其中交易价格最低的 s 条卖出记录和交易价格最高的 s 条买入记录。

输入格式

第一行包含两个正整数 n,s。

接下来 n 行,每行包含一个记录,格式如题目描述。

输出格式

首先,按照交易价格从高到低的顺序,输出交易价格最低的 s 条卖出记录,每行一条,格式与输入相同。如果不足 s 条,则有多少输出多少。

然后,按照交易价格从高到低的顺序,输出交易价格最高的 s 条买入记录,每行一条,格式与输入相同。如果不足 s 条,则有多少输出多少。

数据范围

前 4个测试点满足 1≤n≤6。
所有测试点满足 1≤n≤1000,1≤s≤50,0≤p≤105,1≤q≤104。

输入样例:

6 2
B 10 3
S 50 2
S 40 1
S 50 6
B 20 4
B 25 10

输出样例:

S 50 8
S 40 1
B 25 10
B 20 4

#include<bits/stdc++.h>
using namespace std;
typedef pair<int,int>PII;
map<int,int>mp1;
map<int,int>mp2;
int n,s;
char str[2];
bool cmp(PII a,PII b){
	return a.first>b.first;
}
bool cmp1(PII a,PII b){
	return a.first<b.first;
}
int main()
{
	cin>>n>>s;
	while(n--)
	{
		int a,b;
		cin>>str>>a>>b;
	    if(*str=='B')mp1[a]+=b;
	    else mp2[a]+=b;
	}
	
	int tems=s;
    vector<PII>vec2(mp2.begin(),mp2.end());
    sort(vec2.begin(),vec2.end(),cmp1);
    stack<PII>res;
    for(auto t:vec2)
	{
		
		res.push({t.first,t.second});
		tems--;
		if(!tems)break;
	}
	
      while(res.size()){
      	auto t=res.top();
      	 cout<<"S"<<" "<<t.first<<" "<<t.second<<endl;
      	 res.pop();
	  }
	 
	
	tems=s;
    vector<PII>vec(mp1.begin(),mp1.end());
    sort(vec.begin(),vec.end(),cmp);
    
    for(auto t:vec)
	{
		cout<<"B"<<" "<<t.first<<" "<<t.second<<endl;
		tems--;
		if(!tems)break;
	}
    
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值