Codeforces Round #317 [AimFund Thanks-Round] (Div. 2) B. Order Book

原题: http://codeforces.com/contest/572/problem/B


题目大意: 对n个股票操作进行排序, 最后生成一个Order Book. 操作有两种, buy 和 sell, 后边是股票标号和价钱. 要求对相同操作的相同股票进行合并操作. 然后输出排序后前s个sell和buy的股票. 这里的排序要求是, 对于sell, 先对编号递增排序, 然后取前s (没有s个取所有). 然后再对编号递减排序. 对于buy直接递减排序即可.


分析: 用Java的TreeMap一下就出来了. 因为TreeMap本身就是有序的, 用Collections.reverseOrder()可以改变顺序. 然后取前s个的时候, 可以把set变成stream, 然后limit一下就可以

public void solve(int testNumber, InputReader in, OutputWriter out) {
        int n = in.readInt();
        int s = in.readInt();
        int cb = 0;
        int cs = 0;
        Map<Integer, Integer> BMap = new TreeMap<Integer, Integer>(Collections.reverseOrder());
        Map<Integer, Integer> SMap = new TreeMap<Integer, Integer>();
        for (int i = 0; i < n; i++) {
            String t = in.next();
            if (t.equals("B")) {
                Integer d = Integer.valueOf(in.next());
                Integer p = Integer.valueOf(in.next());
                if (BMap.containsKey(d))
                    BMap.put(d, BMap.get(d) + p);
                else
                    BMap.put(d,p);
                cb++;
            }
            else{
                Integer d = Integer.valueOf(in.next());
                Integer p = Integer.valueOf(in.next());
                if (SMap.containsKey(d))
                    SMap.put(d, SMap.get(d) + p);
                else
                    SMap.put(d,p);
                cs++;
            }
        }
        Stream<Map.Entry<Integer, Integer>> stream_s = SMap.entrySet().stream().limit(s).sorted(Map.Entry.comparingByKey(Collections.reverseOrder()));

        Stream<Map.Entry<Integer, Integer>> stream_b = BMap.entrySet().stream().limit(s);

        stream_s.forEach(ss -> out.printLine("S " + ss.getKey() + " " + ss.getValue()));
        stream_b.forEach(ss -> out.printLine("B " + ss.getKey() + " " + ss.getValue()));

    }