習題5_14 uva1598交易所(想看題意搓進來)

說聲抱歉,這題寫的代碼有點亂,所以後面有時間再改,雖然AC了
先講思路,防止以後自己忘了…
這題主要題意爲多組數據,每次很多交易記錄,如果此時買的時候,發現有比他內心價格還低的價格,就買,賣的時候,發現有比他心中價格高的,就賣,如果沒買完或者賣完,放着剩下的等待,
如果在買或者賣之時,發現有人出價相同,那麼編號在前的先來(防止打打殺殺)。
如果還有一個是廢除編號第幾的命令(保證只廢除買或者賣的),不管那條命令是否執行完,都廢除,即說白,執行完咱們就不用管了,沒執行卡掉,執行一半(就是有進行買賣但有剩餘)也卡掉剩下的。
然後接下來如果可以進行交易,先把交易的數量價格輸出(買肯定是由小到大買),(賣肯定是由大到小賣)
每條指令quote一次 左邊買右邊賣,如果此時左邊 莫得人 輸出 0 0 ,右邊莫得人 輸出 0 99999
好像就沒了…
思路:剛開始200多行T了…因爲比較暴力每次就廢除直接刪,開個vector把前面的整就來,刪完在整回去,而找輸出的數也用vector整進來整出去…
其實不然,如果你要刪,你可以先標記他不存在了就行,如果每次進行buy sell 之時順便刪了就好,
而找優先隊列的第一個後面與其相同的price 數量有多少,只需要前面開個數組,存一下每個price有多少數量就行了…買和賣分開存…然後就模擬就沒了
但因爲本人菜,所以不能把兩個很相似的東西整成函數,只會複製粘貼,,,所以後面再改吧…謝謝觀看廢話

#include <bits/stdc++.h>
using namespace std;
const int MA = 1e5 + 5;
const int MM = 1e6 + 6;
struct buy {
	int num,prize,bian;
	bool operator <(const buy b)const {
		if(this-> prize == b.prize) return this->bian > b.bian;
		return this-> prize < b.prize;  //高在前 
	}
}wz;
struct sell {
	int num,prize,bian;
	bool operator <(const sell b)const {
		if(this-> prize == b.prize) return this->bian > b.bian;
		return this-> prize > b.prize; // 低在前 
	}
}qw;
int bma[MA],bpz[MA],bsz[MA],bpf[MA],mlpb[MM],mlps[MM];
int main()
{
	
	int n,j; char s[10];
	int kase = 0;
	while(scanf("%d",&n)== 1 && n)
	{
		if(kase)  printf("\n");
		int sz,pz;
		priority_queue <buy> de; priority_queue <sell> chu;
		memset(bma,0,sizeof(bma));
		memset(bpz,0,sizeof(bpz));
		memset(bsz,0,sizeof(bsz));
		memset(bpf,0,sizeof(bpf));
		memset(mlpb,0,sizeof(mlpb));
		memset(mlps,0,sizeof(mlps));
		//初始化 
		for (int i = 1; i <= n; i++)
		{
			//加數 
			cin>>s;
			if(s[0] == 'B' || s[0] == 'S')  //買或者賣 
			{
				scanf("%d%d",&sz,&pz);
				if(s[0] == 'B')    //買 
				{
					while(!chu.empty() && !bma[chu.top().bian]) chu.pop();
					while(!chu.empty())  //清空沒用的 
					{						
						qw = chu.top();
						if(qw.prize > pz) 
						{
							break; // 莫得談
						}
						else 
						{
							if(qw.num > sz) 
							{
								chu.pop();
								qw.num -= sz;  bsz[qw.bian] -=sz;
								mlps[qw.prize] -=sz; // 三個地方要減 
								printf("TRADE %d %d\n",sz,qw.prize);
								sz = 0;
								chu.push(qw);
								break;
							}
							else
							{
								chu.pop();
								sz -=qw.num;  
								mlps[qw.prize] -=qw.num;
								printf("TRADE %d %d\n",qw.num,qw.prize);
							    bma[qw.bian] = 0;
							}
						} 
						while(!chu.empty() && !bma[chu.top().bian]) chu.pop();
					}
					if(sz){
						wz.num = sz; wz.prize = pz; wz.bian = i;
						de.push(wz); bma[i] = 1;
						bpz[i] = pz; bsz[i] = sz; bpf[i] = 1;
						mlpb[pz]+=sz; 
					}
				}
				else   // 賣 
				{
					while(!de.empty() && !bma[de.top().bian]) de.pop();
					while(!de.empty())
					{ 
						wz = de.top();
						if(wz.prize < pz) 
						{
							break; // 莫得談
						}
						else 
						{
							if(wz.num > sz)
							{
								de.pop();
								wz.num -= sz; bsz[wz.bian] -=sz;
								mlpb[wz.prize] -=sz;
								printf("TRADE %d %d\n",sz,wz.prize);
								sz = 0;
								de.push(wz);
								break;
							}
							else
							{
								de.pop();
								sz -= wz.num; mlpb[wz.prize] -=wz.num;
								printf("TRADE %d %d\n",wz.num,wz.prize);
								bma[wz.bian] = 0; 
							}
						} 
						while(!de.empty() && !bma[de.top().bian]) de.pop();
					}
					if(sz){
						   qw.num = sz; qw.prize = pz; qw.bian = i;
						   chu.push(qw); bma[i] = 1; 
						   bpz[i] = pz; bsz[i] = sz; bpf[i] = 0;
							mlps[pz]+=sz;
					}
				}
				
			}
			else
			{
				int ma;   scanf("%d",&ma);
				if(bma[ma]){
					bma[ma] = 0;
						if(bpf[ma] == 1) mlpb[bpz[ma]] -=bsz[ma];
							else             mlps[bpz[ma]] -=bsz[ma];
				}
			}
			//找數 
				while(!de.empty() && !bma[de.top().bian]) de.pop();
				while(!chu.empty() && !bma[chu.top().bian]) chu.pop();
				int a1,a2,b1,b2;
				if(de.empty()){
					a1 = 0; a2 = 0;
				}			
				else {
					a2 = de.top().prize; a1 = mlpb[de.top().prize];
				}
				if(chu.empty()){
					b1 = 0; b2 = 99999;
				}
				else {
					b2 = chu.top().prize; b1 = mlps[chu.top().prize];
				}				
				printf("QUOTE %d %d - %d %d\n",a1,a2,b1,b2); 
		}
		kase++;
	}
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章