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())); }
Leave A Comment