您的位置:首页 > 其它

算法竞赛入门经典 第二版 习题5-14 交易所 Exchange uva1598

2017-03-17 18:02 225 查看
题目:https://vjudge.net/problem/UVA-1598

题目大意:这题算挺难读的,有些细节问题。大意是输入一系列订单和指令,包括BUY, SELL和CANCEL以及每单的数量和价格,当前价格最低的卖订单和当前出价最高的买订单优先交易,交易成立的条件是当前卖方出价小于等于买方出价,当有多个价格相同的订单时,按订单给出的先后顺序交易,交易数量按双方订单最小数量交易。交易后,数量变为零的订单算已完成,不再参与交易和统计。交易价格规定从样例中能读出,当前是买订单时价格是卖方最低出价,反之同理。CANCEL指令表示撤销第i个指令所对应的订单,注意订单可能已交易完成,或交易了部分。无论是否交易每个指令执行完后都要输出以QUOTE开头的提示信息,包括当前最高买方出价及该价位的所有买订单的货物数量和,若目前无买订单激活,输出0
0;卖方同理,若目前无买订单激活,输出0 99999。

思路:奈何我做的时候没人把题意描述的这么清楚,英语并不好的我题意细节几乎都是试出来的。这题输入数据量很大,否则时限也不会是4.5s结果我就经历了好几次超时,放弃C++流式读写后仍超时,最后想到把订单的所有数据全部放到一个结构体里,然后所有订单全部动态申请用指针来进行修改大大降低了在多个容器里的查找时间。虽说如此,1.2s的时间也不短,而且代码写的很繁琐难懂,能力所限无奈啊。

代码:C++11

#include <iostream>
#include <cstdio>
#include <string>
#include <set>
#include <map>
#include <vector>
#include <deque>
#include <algorithm>
using namespace std;

struct Orderform
{
public:
bool status;//true for buy, false for sell
int quantity, price, serial;
Orderform() {}
Orderform(bool t, int quan, int pri, int i):status(t), quantity(quan), price(pri), serial(i) {}
};

map<int, deque<Orderform*> > buydata;//price, quantity
map<int, deque<Orderform*> > selldata;//price, quantity
map<int, Orderform*> orderform;

int getsum(deque<Orderform*> &all)
{
int sum = 0;
for(Orderform* t:all)
{
sum += t->quantity;
}
return sum;
}

int main()
{
int T;
bool firstline = true;
while(cin >> T)
{
if(firstline)
{
firstline = false;
}
else
{
putchar('\n');
}
for(int i=1; i<=T; i++)
{
char s[20];
scanf("%s", s);
if(s[0]=='C')
{
int serial;
scanf("%d", &serial);
if(orderform.find(serial)!=orderform.end())
{
if(orderform[serial]->status)//buy
{
int temprice = orderform[serial]->price;
deque<Orderform*>::iterator it = find(buydata[temprice].begin(), buydata[temprice].end(), orderform[serial]);
buydata[temprice].erase(it);
if(buydata[temprice].empty())
{
buydata.erase(temprice);
}
}
else
{
int temprice = orderform[serial]->price;
deque<Orderform*>::iterator it = find(selldata[temprice].begin(), selldata[temprice].end(), orderform[serial]);
selldata[temprice].erase(it);
if(selldata[temprice].empty())
{
selldata.erase(temprice);
}
}
delete orderform[serial];
orderform.erase(serial);
}
}
else
{
int price, quantity;
scanf("%d%d", &quantity, &price);
if(s[0]=='B')
{
orderform[i] = new Orderform(true, quantity, price, i);
buydata[price].push_back(orderform[i]);
}
else
{
orderform[i] = new Orderform(false, quantity, price, i);
selldata[price].push_back(orderform[i]);
}
}
if(s[0]=='B')
{
while(!buydata.empty()&&!selldata.empty()&&buydata.rbegin()->first>=selldata.begin()->first)
{
int tradeprice = selldata.begin()->first;
int tradequantity = min((buydata.rbegin()->second).front()->quantity, (selldata.begin()->second).front()->quantity);
printf("TRADE %d %d\n", tradequantity, tradeprice);
(buydata.rbegin()->second).front()->quantity -= tradequantity;
if((buydata.rbegin()->second).front()->quantity==0)
{
int serial = (buydata.rbegin()->second).front()->serial;
delete (buydata.rbegin()->second).front();
orderform.erase(serial);
(buydata.rbegin()->second).pop_front();
if((buydata.rbegin()->second).empty())
{
auto iter = buydata.end();
iter--;
buydata.erase(iter);
}
}
(selldata.begin()->second).front()->quantity -= tradequantity;
if((selldata.begin()->second).front()->quantity==0)
{
int serial = (selldata.begin()->second).front()->serial;
delete (selldata.begin()->second).front();
orderform.erase(serial);
(selldata.begin()->second).pop_front();
if((selldata.begin()->second).empty())
{
selldata.erase(selldata.begin());
}
}
}
}
else if(s[0]=='S')
{
while(!buydata.empty()&&!selldata.empty()&&selldata.begin()->first<=buydata.rbegin()->first)
{
int tradeprice = buydata.rbegin()->first;
int tradequantity = min((buydata.rbegin()->second).front()->quantity, (selldata.begin()->second).front()->quantity);
printf("TRADE %d %d\n", tradequantity, tradeprice);
(selldata.begin()->second).front()->quantity -= tradequantity;
if((selldata.begin()->second).front()->quantity==0)
{
int serial = (selldata.begin()->second).front()->serial;
orderform.erase(serial);
delete (selldata.begin()->second).front();
(selldata.begin()->second).pop_front();
if((selldata.begin()->second).empty())
{
selldata.erase(selldata.begin());
}
}
(buydata.rbegin()->second).front()->quantity -= tradequantity;
if((buydata.rbegin()->second).front()->quantity==0)
{
int serial = (buydata.rbegin()->second).front()->serial;
orderform.erase(serial);
delete (buydata.rbegin()->second).front();
(buydata.rbegin()->second).pop_front();
if((buydata.rbegin()->second).empty())
{
auto iter = buydata.end();
iter--;
buydata.erase(iter);
}
}
}
}
printf("QUOTE ");
if(buydata.empty())
{
printf("0 0 - ");
}
else
{
printf("%d %d - ", getsum(buydata.rbegin()->second), buydata.rbegin()->first);
}
if(selldata.empty())
{
printf("0 99999\n");
}
else
{
printf("%d %d\n", getsum(selldata.begin()->second), selldata.begin()->first);
}
}
for(auto &t:orderform)
{
delete t.second;
}
buydata.clear();
selldata.clear();
orderform.clear();
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐