CCF2014123集合竞价(C语言版)

问题描述
  某股票交易所请你编写一个程序,根据开盘前客户提交的订单来确定某特定股票的开盘价和开盘成交量。
  该程序的输入由很多行构成,每一行为一条记录,记录可能有以下几种:
  1. buy p s 表示一个购买股票的买单,每手出价为p,购买股数为s。
  2. sell p s 表示一个出售股票的卖单,每手出价为p,出售股数为s。
  3. cancel i表示撤销第i行的记录。
  如果开盘价为p0,则系统可以将所有出价至少为p0的买单和所有出价至多为p0的卖单进行匹配。因此,此时的开盘成交量为出价至少为p0的买单的总股数和所有出价至多为p0的卖单的总股数之间的较小值。
  你的程序需要确定一个开盘价,使得开盘成交量尽可能地大。如果有多个符合条件的开盘价,你的程序应当输出最高的那一个。
输入格式
  输入数据有任意多行,每一行是一条记录。保证输入合法。股数为不超过108的正整数,出价为精确到恰好小数点后两位的正实数,且不超过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。
解题思路:
开盘价只能是buy和sell中的某个价格,又由于如果可成交股数相同则需要输出成交价较大的那个作为开盘价,因此只在 buy命令中寻找开盘价即可,这样既保证了题目要求,又减少了时间开支。
写完代码提交时只有80分,后来对所有命令的出价进行降序排序,再次提交还是80分,可见排序对此题也没用。始终不知道问题出在哪里。下面给出80分版本的代码:
 1 #include <stdio.h>
 2 #include <string.h>
 3 
 4 struct charge{
 5     char tra[10];
 6     float price;
 7     long long num;
 8 };
 9 struct charge order[5005];
10 
11 int main(int argc, const char * argv[]) {
12     int i ,j ,k = 1 ;
13     int line ;
14     long long maxNum=0 ;
15     float p0 = 0.0 , flag = 0.0;
16     while(scanf("%s" , order[k].tra )!= EOF)
17     {//输入记录 
18         if(strcmp("buy" , order[k].tra)== 0 || strcmp("sell" , order[k].tra) == 0){
19             scanf("%f%lld" , &order[k].price, &order[k].num);
20         }
21         if(strcmp("cancel" , order[k].tra)==0){
22             scanf("%d",&line);//要撤销的行 
23             order[k].price = 0.0 ;//cancel 密令下没有价格和数量,都设置为 0 
24             order[k].num = 0 ;
25             order[line].price = 0.0 ;//将需要撤销的命令的价格、数量设置为0,等于取消操作 
26             order[line].num = 0 ;
27         }
28         k ++;
29     }
30     for(i = 1 ; i < k ;i++)
31     {//按出价降序排序 
32         int index;
33         float max ;
34         struct charge temp;
35         max = order[i].price;
36         for(j = i+1 ; j < k ;j++)
37         {
38             if(order[j].price >= max){
39                 max = order[j].price;
40                 index = j ;
41             }
42         }
43         temp = order[i];
44         order[i] = order[index];
45         order[index] = temp; 
46     }
47     for(i = 1 ; i <k ; i ++)
48     {//检查每一行命令,设置buy 的命令的价格作为开盘价 
49         long long sellNum=0 , buyNum= 0 ,num;
50         if(strcmp(order[i].tra , "buy")==0)
51             p0 = order[i].price ;
52         else continue ;
53         for(j = 1 ; j < k ; j++)
54         {//如果以 p0 为开盘价,检查所有交易命令。 
55             if(strcmp(order[j].tra , "buy")==0 && order[j].price >= p0){
56                 buyNum += order[j].num;//对于 buy ,如果出价大于等于 p0,则购入所需股数 
57             }
58             if(strcmp(order[j].tra , "sell")==0 && order[j].price <= p0){
59                 sellNum += order[j].num;//对于sell 命令,如果出价小于等于 p0 ,则出售所要出售的股数 
60             }
61         }
62         num = (buyNum >= sellNum )? sellNum : buyNum;//能够成交的股数应该是购入和出售之间较小的那个数量 
63         if(num > maxNum){ maxNum = num ; flag = p0;}//寻找最大的那个能成交的股数 
64     }
65     printf("%.2f %lld
", flag , maxNum) ;
66     return 0;
67 }

明天CCF考试,求过~~~

原文地址:https://www.cnblogs.com/roadofstudy/p/6576149.html