posts - 4,  comments - 0,  trackbacks - 0
          因為題目數(shù)據(jù)較小,所以可以直接模擬。
          每讀入一個命令所要進(jìn)行的操作:
          如果是buy,則該種價格的買入數(shù)+ni,將該種價格加入到買入價格的集合中。
          如果是sell,則該種價格的賣出數(shù)+mi,將該種價格加入到賣出價格的集合中。
           
          然后進(jìn)行銷售的操作:
          比較最低的賣出價格和最高的買入價格,
          如果前者小于等于后者則:
          設(shè)最低賣出價格的賣出數(shù)為a,最高買入價格的買入數(shù)為b.
          則a=a-min(a,b),b=b-min(a,b)
          如果其中賣出數(shù)變?yōu)?,則在賣出價格集合中刪去該種賣出價格。買入數(shù)同理。
          記錄股票價格
          ------------------------------------------------------------------------------------------------------
          直到最低的賣出價格比最高的買入價格要高或者其中一個集合為空時跳出。
           
          將余下來最低的賣出數(shù)不為0的賣出價格輸出,如果賣出價格集合為空就輸出”-”
          買入價格同理,最后再輸出股票價格
          這樣就完成了一次命令的操作
          注意賣出價格集合為空和買入價格集合為空時的情況
           
          代碼如下:
           1 //by NKU lkjslkjdlk
           2 #include<cstdio>
           3 #include<cstring>
           4 #include<set>
           5 using namespace std;
           6 inline int min(int x,int y){return x<y?x:y;}
           7 int cas,or_num,sto_pri,i,bid[1005],ask[1005],trade_num,trade_pri,min_de;
           8 char order[100],tmp[10],bs[5],ch;
           9 set<int> bids,asks;set<int>::reverse_iterator biter;set<int>::iterator aiter;
          10 void print(){
          11     if(asks.empty())printf("");else printf("%d ",*asks.begin());
          12     if(bids.empty())    printf("");else printf("%d ",*bids.rbegin());
          13     if(sto_pri==-1)    printf("-\n");else printf("%d\n",sto_pri);
          14 }
          15 void sell(){
          16     while(1){
          17         biter=bids.rbegin();aiter=asks.begin();
          18         if(*biter>=*aiter){
          19             min_de=min(bid[*biter],ask[*aiter]);
          20             bid[*biter]-=min_de;ask[*aiter]-=min_de;
          21             sto_pri=*aiter;
          22             if(bid[*biter]==0)    bids.erase(*biter);
          23             if(ask[*aiter]==0)    asks.erase(*aiter);
          24         }    
          25         if(asks.empty()||bids.empty())    break;
          26         if(*asks.begin()>*bids.rbegin())    break;
          27     }
          28 }
          29 int main()
          30 {
          31     scanf("%d",&cas);
          32     while(cas--){
          33         bids.clear();asks.clear();
          34         memset(bid,0,sizeof(bid));memset(ask,0,sizeof(ask));
          35         scanf("%d%c",&or_num,&ch);
          36         for(i=0,sto_pri=-1;i<or_num;i++){
          37             gets(order);sscanf(order,"%s %d %s %s %d",bs,&trade_num,tmp,tmp,&trade_pri);
          38             if(!strcmp(bs,"buy")){
          39                 bids.insert(trade_pri);bid[trade_pri]+=trade_num;
          40                 if(!asks.empty()){sell();print();}else print();
          41             }
          42             else{
          43                 asks.insert(trade_pri);ask[trade_pri]+=trade_num;
          44                 if(!bids.empty()){sell();print();}else print();
          45             }    
          46         }
          47     }
          48     return 0;
          49 }


          posted on 2011-10-11 00:50 NKU->lkjslkjdlk 閱讀(275) 評論(0)  編輯  收藏

          只有注冊用戶登錄后才能發(fā)表評論。


          網(wǎng)站導(dǎo)航:
           
          <2011年10月>
          2526272829301
          2345678
          9101112131415
          16171819202122
          23242526272829
          303112345

          常用鏈接

          留言簿

          隨筆檔案

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 淮南市| 蓬溪县| 墨竹工卡县| 特克斯县| 长宁县| 资中县| 太白县| 体育| 青冈县| 内乡县| 恩平市| 平利县| 苍南县| 晋宁县| 门头沟区| 大竹县| 涞源县| 鄂伦春自治旗| 安多县| 苍溪县| 松溪县| 嘉黎县| 丹阳市| 独山县| 侯马市| 安仁县| 唐河县| 彩票| 遵化市| 桓仁| 正阳县| 云林县| 日土县| 灌云县| 论坛| 望奎县| 璧山县| 南通市| 乐昌市| 武宣县| 镇雄县|