算法竞赛入门经典 第二版 习题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;
}
题目大意:这题算挺难读的,有些细节问题。大意是输入一系列订单和指令,包括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;
}
相关文章推荐
- 算法竞赛入门经典(第二版)-刘汝佳-第六章 数据结构基础 习题(12/14)
- 算法竞赛入门经典(第二版)第二章课后习题
- 算法竞赛入门经典(第二版)-刘汝佳-第三章 数组与字符串 例题+习题(17/18)
- 算法竞赛入门经典(第二版)第二章 习题2-2 韩信点兵
- 算法竞赛入门经典 第二版 习题5-15 Fibonacci的复仇 Revenge of Fibonacci uva12333
- 算法竞赛入门经典(第二版)习题解答参考(第二章)
- 算法竞赛入门经典(第二版)-刘汝佳-第八章 高效算法设计 习题(6/28)
- 算法竞赛入门经典 第二版 习题5-11 更新字典 Updating a Dictionary uva12504
- 算法竞赛入门经典 第二版 习题6-1 平衡的括号 Parentheses Balance uva673
- 算法竞赛入门经典(第二版) 习题3-5 谜题(Puzzle) UVa227 Finals1993
- 算法竞赛入门经典 第二版 习题4-4 骰子涂色 Cube painting uva253
- 算法竞赛入门经典 第二版 习题6-3 二叉树重建 Tree Recovery uva536
- 《算法竞赛入门经典(第二版)》第三章 习题(6-9)
- 算法竞赛入门经典第二版习题2-5 分数化小数
- 刘汝佳《算法竞赛入门经典(第二版)》习题(八)
- 算法竞赛入门经典 第二版 习题4-10 洪水 Flooded uva815
- 算法竞赛入门经典(第二版)-刘汝佳-第四章 函数与递归 例题+习题(15/16)
- 算法竞赛入门经典(第二版)-刘汝佳-第九章 动态规划初步 习题
- 习题2-5 分数化小数 (算法竞赛入门经典(第二版)刘汝佳 第二章 )
- 算法竞赛入门经典 第二版 习题5-10 在Web中搜索 Searching the Web uva1597