diff --git a/src/class04_07/Code02_EveryStepShowBoss.java b/src/class04_07/Code02_EveryStepShowBoss.java index 6fa2af6..5f10ce4 100644 --- a/src/class04_07/Code02_EveryStepShowBoss.java +++ b/src/class04_07/Code02_EveryStepShowBoss.java @@ -10,12 +10,12 @@ public class Code02_EveryStepShowBoss { public static class Customer { public int value; public int buy; - public int order; + public int enterTime; public Customer(int v, int b, int o) { value = v; buy = b; - order = 0; + enterTime = 0; } } @@ -23,7 +23,7 @@ public class Code02_EveryStepShowBoss { @Override public int compare(Customer o1, Customer o2) { - return o1.buy != o2.buy ? (o2.buy - o1.buy) : (o1.order - o2.order); + return o1.buy != o2.buy ? (o2.buy - o1.buy) : (o1.enterTime - o2.enterTime); } } @@ -32,7 +32,7 @@ public class Code02_EveryStepShowBoss { @Override public int compare(Customer o1, Customer o2) { - return o1.buy != o2.buy ? (o1.buy - o2.buy) : (o1.order - o2.order); + return o1.buy != o2.buy ? (o1.buy - o2.buy) : (o1.enterTime - o2.enterTime); } } @@ -42,19 +42,15 @@ public class Code02_EveryStepShowBoss { private HeapGreater candHeap; private HeapGreater daddyHeap; private final int daddyLimit; - public int ctime; - public int dtime; public WhosYourDaddy(int limit) { customers = new HashMap(); candHeap = new HeapGreater<>(new CandidateComparator()); daddyHeap = new HeapGreater<>(new DaddyComparator()); daddyLimit = limit; - ctime = 0; - dtime = 0; } - public void operate(int number, boolean buyOrRefund) { + public void operate(int time, int number, boolean buyOrRefund) { if (!buyOrRefund && !customers.containsKey(number)) { return; } @@ -72,10 +68,10 @@ public class Code02_EveryStepShowBoss { } if (!candHeap.contains(c) && !daddyHeap.contains(c)) { if (daddyHeap.size() < daddyLimit) { - c.order = dTime++; + c.enterTime = time; daddyHeap.push(c); } else { - c.order = cTime++; + c.enterTime = time; candHeap.push(c); } } else if (candHeap.contains(c)) { @@ -91,7 +87,7 @@ public class Code02_EveryStepShowBoss { daddyHeap.resign(c); } } - daddyMove(); + daddyMove(time); } public List getDaddies() { @@ -103,20 +99,20 @@ public class Code02_EveryStepShowBoss { return ans; } - private void daddyMove() { + private void daddyMove(int time) { if (candHeap.isEmpty()) { return; } if (daddyHeap.size() < daddyLimit) { Customer p = candHeap.pop(); - p.order = dTime++; + p.enterTime = time; daddyHeap.push(p); } else { if (candHeap.peek().buy > daddyHeap.peek().buy) { Customer oldDaddy = daddyHeap.pop(); Customer newDaddy = candHeap.pop(); - oldDaddy.order = cTime++; - newDaddy.order = dTime++; + oldDaddy.enterTime = time; + newDaddy.enterTime = time; daddyHeap.push(newDaddy); candHeap.push(oldDaddy); } @@ -129,19 +125,14 @@ public class Code02_EveryStepShowBoss { List> ans = new ArrayList<>(); WhosYourDaddy whoDaddies = new WhosYourDaddy(k); for (int i = 0; i < arr.length; i++) { - whoDaddies.operate(arr[i], op[i]); + whoDaddies.operate(i, arr[i], op[i]); ans.add(whoDaddies.getDaddies()); } return ans; } - public static int cTime = 0; - public static int dTime = 0; - public static List> compare(int[] arr, boolean[] op, int k) { HashMap map = new HashMap<>(); - cTime = 0; - dTime = 0; ArrayList cands = new ArrayList<>(); ArrayList daddy = new ArrayList<>(); List> ans = new ArrayList<>(); @@ -166,10 +157,10 @@ public class Code02_EveryStepShowBoss { } if (!cands.contains(c) && !daddy.contains(c)) { if (daddy.size() < k) { - c.order = dTime++; + c.enterTime = i; daddy.add(c); } else { - c.order = cTime++; + c.enterTime = i; cands.add(c); } } @@ -177,20 +168,20 @@ public class Code02_EveryStepShowBoss { cleanZeroBuy(daddy); cands.sort(new CandidateComparator()); daddy.sort(new DaddyComparator()); - move(cands, daddy, k); + move(cands, daddy, k, i); ans.add(getCurAns(daddy)); } return ans; } - public static void move(ArrayList cands, ArrayList daddy, int k) { + public static void move(ArrayList cands, ArrayList daddy, int k, int time) { if (cands.isEmpty()) { return; } if (daddy.size() < k) { Customer c = cands.get(0); - c.order = dTime++; + c.enterTime = time; daddy.add(c); cands.remove(0); } else { @@ -199,8 +190,8 @@ public class Code02_EveryStepShowBoss { daddy.remove(0); Customer newDaddy = cands.get(0); cands.remove(0); - newDaddy.order = dTime++; - oldDaddy.order = cTime++; + newDaddy.enterTime = time; + oldDaddy.enterTime = time; daddy.add(newDaddy); cands.add(oldDaddy); } @@ -274,9 +265,9 @@ public class Code02_EveryStepShowBoss { } public static void main(String[] args) { - int maxValue = 20; - int maxLen = 200; - int maxK = 10; + int maxValue = 10; + int maxLen = 100; + int maxK = 6; int testTimes = 100000; System.out.println("测试开始"); for (int i = 0; i < testTimes; i++) {