集合競價 CCF java實現 (大部分代碼是借鑑的別人的,)

(只是把借鑑代碼完善成100分了,分享給大家)

問題描述   某股票交易所請你編寫一個程序,根據開盤前客戶提交的訂單來確定某特定股票的開盤價和開盤成交量。
  該程序的輸入由很多行構成,每一行爲一條記錄,記錄可能有以下幾種:
  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。
時間要求爲1.0 S,內存要求爲256M



具體代碼實現:

import java.io.BufferedInputStream;
import java.util.Arrays;
import java.util.Comparator;
import java.util.Scanner;


class StockArray{          
    String SBC;
    float price;
    long number;
}

public class Stocks {
 public static void main(String[] args){

     

        Scanner scanner=new Scanner(new BufferedInputStream(System.in));

        StockArray[] ss=new StockArray[5002];
        for (int i = 0; i < 5002; i++) {
            ss[i]=new StockArray();
        }


        int num=1;
        while(scanner.hasNextLine()){
         
            String a = scanner.nextLine();
          
            if(a.trim().length()==0)
            {
             break;
            }

           
            String []b = a.split(" ");
            ss[num].SBC=b[0];
            if (ss[num].SBC.equals("buy")||ss[num].SBC.equals("sell")) {
                ss[num].price=Float.parseFloat(b[1]);
                ss[num].number=Long.parseLong(b[2]);
            }else if (ss[num].SBC.equals("cancel")) {
                ss[(int) Long.parseLong(b[1])].SBC="CANCEL";
            }
           
           

            num++; 
        }
        scanner.close();
      

        StockArray[] n1=new StockArray[num];
        for (int i = 0; i < num; i++) {
            n1[i]=new StockArray();
        }

        StockArray[] n2=new StockArray[num]; 
        for (int i = 0; i < num; i++) {
            n2[i]=new StockArray();
        }

        int num1=0;
        int num2=0;
        long ans_num=0;
        float ans_price=0;

        for(int i=1;i<num;i++){
            if (ss[i].SBC.equals("buy")) {
                n1[num1].price=ss[i].price;
                n1[num1].number=ss[i].number;
                num1++;
            }
            if (ss[i].SBC.equals("sell")) { 
                n2[num2].price=ss[i].price;
                n2[num2].number=ss[i].number;
                num2++;
            }
        }

        Arrays.sort(n1,0,num1,new MyComprator1());
        Arrays.sort(n2,0,num2,new MyComprator2());

        long sum1=0, sum2;
        float p;
        for (int i = 0; i < num1; i++) {
            p=n1[i].price;
            sum1+=n1[i].number;
            sum2=0;
            for (int j = 0; j < num2; j++) {
                if (n2[j].price>n1[i].price)
                    break;
                    sum2+=n2[j].number;
            }

            long min_sum=Math.min(sum1, sum2);

            if (ans_num<min_sum) {
                ans_num=min_sum;
                ans_price=p;
            }
        }

     
       
        System.out.printf("%.2f",ans_price);
        System.out.printf(" "+ans_num);

       

      
    }

}

class MyComprator1 implements Comparator<Object>{
    public int compare(Object o1, Object o2){
        StockArray s1=(StockArray)o1;
        StockArray s2=(StockArray)o2;

        if (s1.price!=s2.price) {
            return s2.price>s1.price ? 1: -1;
        }else {
            return s2.number>s1.number ? 1:-1;
        }      
    }
}

class MyComprator2 implements Comparator<Object>{
    public int compare(Object o1, Object o2){
        StockArray s1=(StockArray)o1;
        StockArray s2=(StockArray)o2;
        if (s1.price!=s2.price) {
            return s1.price>s2.price ? 1: -1;
        }else {
            return s1.number>s2.number ? 1:-1;
        }  
    }
   


}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章