試題編號: | 201412-3 |
試題名稱: | 集合競價 |
時間限制: | 1.0s |
內存限制: | 256.0MB |
問題描述: |
問題描述
某股票交易所請你編寫一個程序,根據開盤前客戶提交的訂單來確定某特定股票的開盤價和開盤成交量。
該程序的輸入由很多行構成,每一行為一條記錄,記錄可能有以下幾種: 1. buy p s 表示一個購買股票的買單,每手出價為p,購買股數為s。 2. sell p s 表示一個出售股票的賣單,每手出價為p,出售股數為s。 3. cancel i表示撤銷第i行的記錄。 如果開盤價為p 0,則系統可以將所有出價至少為p 0的買單和所有出價至多為p 0的賣單進行匹配。因此,此時的開盤成交量為出價至少為p 0的買單的總股數和所有出價至多為p 0的賣單的總股數之間的較小值。 你的程序需要確定一個開盤價,使得開盤成交量盡可能地大。如果有多個符合條件的開盤價,你的程序應當輸出最高的那一個。
輸入格式
輸入數據有任意多行,每一行是一條記錄。保證輸入合法。股數為不超過10
8的正整數,出價為精確到恰好小數點后兩位的正實數,且不超過10000.00。
輸出格式
你需要輸出一行,包含兩個數,以一個空格分隔。第一個數是開盤價,第二個是此開盤價下的成交量。開盤價需要精確到小數點后恰好兩位。
樣例輸入
buy 9.25 100
buy 8.88 175 sell 9.00 1000 buy 9.00 400 sell 8.92 400 cancel 1 buy 100.00 50
樣例輸出
9.00 450
評測用例規模與約定
對於100%的數據,輸入的行數不超過5000。
|
//模擬
1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include<cstdlib> 5 #include<algorithm> 6 using namespace std; 7 struct node 8 { 9 string s; 10 double a; 11 long long b; 12 }; 13 node n[5007],n1[5007],n2[5007]; 14 bool flag[5007]; 15 int num,num1,num2; 16 long long ans_num; 17 double ans_price; 18 bool cmp1(node n11,node n22) 19 { 20 if(n11.a!=n22.a) return n11.a<n22.a; 21 else if(n11.a==n22.a) 22 { 23 return n11.b>=n22.b;} 24 } 25 bool cmp2(node n11,node n22) 26 { 27 if(n11.a!=n22.a) return n11.a>n22.a; 28 else if(n11.a==n22.a) return n11.b>=n22.b; 29 } 30 void slove() 31 { 32 long long sum1=0,sum2=0;double price; 33 int j=0; 34 for(int i=0;i<num1;i++) 35 { 36 price=n1[i].a; 37 sum1+=n1[i].b; 38 sum2=0; 39 for(int j=0;j<num2;j++){ 40 if(n2[j].a>price) break; 41 sum2+=n2[j].b; 42 } 43 if(ans_num<min(sum1,sum2)){ 44 ans_num=min(sum1,sum2); 45 ans_price=price; 46 } 47 } 48 } 49 50 int main() 51 { 52 // freopen("in.txt","r",stdin); 53 num=1; 54 memset(flag,1,sizeof(flag)); 55 while(cin>>n[num].s){ 56 if(n[num].s=="buy"||n[num].s=="sell"){ 57 scanf("%lf%lld",&n[num].a,&n[num].b); 58 num++; 59 } 60 else if(n[num].s=="cancel"){ 61 scanf("%lld",&n[num].b); 62 num++; 63 } 64 } 65 for(int i=num-1;i>=1;i--) 66 { 67 if(n[i].s=="cancel"){ 68 flag[n[i].b]=1-flag[n[i].b]; 69 } 70 } 71 num1=0;num2=0; 72 for(int i=1;i<num;i++) 73 { 74 if(flag[i]){ 75 if(n[i].s=="buy"){ 76 n1[num1].a=n[i].a; 77 n1[num1++].b=n[i].b; 78 } 79 else if(n[i].s=="sell"){ 80 n2[num2].a=n[i].a; 81 n2[num2++].b=n[i].b; 82 } 83 } 84 } 85 sort(n1,n1+num1,cmp2); 86 sort(n2,n2+num2,cmp1); 87 slove(); 88 printf("%.2lf %lld\n",ans_price,ans_num); 89 return 0; 90 }