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;
}
}