Advertisement

上海计算机学会2024年3月月赛C++丙组T4交易记录

阅读量:

交易记录

内存限制: 256 Mb时间限制: 1000 ms

题目描述

小爱最近迷上了炒股,他学会了每天做T、即利用股票价格的短期波动来进行买卖操作来赚取差价,因此每天他的账户中会有很多条买卖的交易记录,也因为交易条数过多,他在复盘每天的交易时,时常感到非常困惑。

已知小爱今天的交易共 n 条记录,每条操作包含三个参数 op a b ,若 op 为 SELL 则表示该条交易记录为卖出操作,为 BUY 则表示该条交易记录为买入操作,a表示该笔交易的单价,b表示该笔交易的数量。

请你帮小爱整理今天的交易记录,整理方式如下:

  • 若有多笔买入操作价格相同时,将这些买入操作合并成一条,交易数量为合并前各笔交易的数量之和
  • 若有多笔卖出操作价格相同时,将这些卖出操作合并成一条,交易数量为合并前各笔交易的数量之和
  • 先按价格从低到高 输出所有合并后的买入操作,格式与输入相同
  • 再按价格从高到低 输出所有合并后的卖出操作,格式与输入相同
输入格式

输入第一行,一个正整数 n
接下来 n 行,每行表示一条交易操作,其中第 𝑖i 行包含三个参数 op,ai​,bi​

输出格式

输出第一行,一个正整数表示整理后交易记录的条数。
接下来每行,按题目要求输出整理后的数据。

数据范围
  • 对于 30%的数据,1≤n≤10
  • 对于 60%的数据,1≤n≤103
  • 对于 100%的数据,1≤n≤105,1≤ai​,bi​≤106
样例数据

输入:
6
BUY 17 10
SELL 50 2
SELL 35 5
BUY 38 6
SELL 50 3
BUY 38 2
输出:
4
BUY 17 10
BUY 38 8
SELL 50 5
SELL 35 5
说明:
买入操作有两次价格为38元,合并后共买入8股
卖出操作有两次价格为50元,合并后共卖出5股

解析:

详见代码:

复制代码
 #include <bits/stdc++.h>

    
 using namespace std;
    
 int n;
    
 struct node{
    
     string op;
    
     int a;
    
     int b;
    
 };
    
 node a[100005];//原始数据
    
 node b[100005];//合并后的数据
    
 //按买入在前,卖出在后排序,操作相同的价高的在前
    
 bool cmp(node x,node y){
    
     if (x.op=="BUY"&&y.op=="BUY"){
    
     return x.a<y.a;
    
     }else if (x.op==y.op){
    
     return x.a>y.a;
    
     }else{
    
     return x.op=="BUY";
    
     }
    
 }
    
 int main() {
    
     cin>>n;
    
     for(int i=1;i<=n;i++){
    
     cin>>a[i].op>>a[i].a>>a[i].b;
    
     }
    
     sort(a+1,a+n+1,cmp);//排序
    
     int cnt=0;//合并后的记录数量
    
     for(int i=1;i<=n;i++){
    
     //操作不同或单价不同,不能合并
    
     if (a[i].a!=b[cnt].a||a[i].op!=b[cnt].op){
    
         cnt++;
    
         b[cnt]=a[i];
    
     }else{//都相同的可以合并
    
         b[cnt].b+=a[i].b;
    
     }
    
     }
    
     cout<<cnt<<endl;
    
     for(int i=1;i<=cnt;i++){
    
     cout<<b[i].op<<" "<<b[i].a<<" "<<b[i].b<<endl;
    
     }
    
     return 0;
    
 }
    
    
    
    

全部评论 (0)

还没有任何评论哟~