中级农民
- 积分
- 106
- 大米
- 颗
- 鳄梨
- 个
- 水井
- 尺
- 蓝莓
- 颗
- 萝卜
- 根
- 小米
- 粒
- 学分
- 个
- 注册时间
- 2012-12-7
- 最后登录
- 1970-1-1
|
写了一个,可以这样搜。- class Balance {
- int level;
- List<Integer> lender;
- List<Integer> borrower;
- Balance(int level, List<Integer> posVals, List<Integer> negVals) {
- this.level = level;
- lender = posVals;
- borrower = negVals;
- }
- public List<Balance> payOnce() {
- List<Balance> ans = new ArrayList<>();
- for (int i = 0; i < lender.size(); i++)
- for (int j = 0; j < borrower.size(); j++) {
- int pos = lender.get(i);
- int neg = borrower.get(j);
- List<Integer> newLender = new ArrayList<>(lender);
- List<Integer> newBorrower = new ArrayList<>(borrower);
- newLender.remove(i);
- newBorrower.remove(j);
- int diff = pos + neg;
- if (diff > 0)
- newLender.add(pos + neg);
- else if (diff < 0)
- newBorrower.add(pos + neg);
- ans.add(new Balance(level + 1, newLender, newBorrower));
- }
- return ans;
- }
- public boolean balanced() {
- return lender.isEmpty() && borrower.isEmpty();
- }
- public String toString() {
- return borrower.toString() + ", " + lender.toString()
- + ", # of payments: " + level;
- }
- }
- public int pay(int[] paid) {
- int n = paid.length;
- long total = 0;
- for (int amount : paid) {
- total += amount;
- }
- if (total % n != 0)
- throw new IllegalArgumentException(
- "Total amount can not be evenly divided.");
- int avg = (int) total / n;
- List<Integer> pos = new ArrayList<>();
- List<Integer> neg = new ArrayList<>();
- for (int amount : paid) {
- int diff = amount - avg;
- if (diff > 0)
- pos.add(diff);
- else if (diff < 0)
- neg.add(diff);
- }
- Balance initialBalance = new Balance(0, pos, neg);
- Queue<Balance> queue = new LinkedList<>();
- queue.offer(initialBalance);
- int ans = Integer.MAX_VALUE;
- while (true) {
- Balance cur = queue.poll();
- System.out.println(cur);
- if (cur.balanced()) {
- ans = cur.level;
- break;
- }
- List<Balance> nextLevel = cur.payOnce();
- for (Balance newBalance : nextLevel)
- queue.offer(newBalance);
- }
- return ans;
- }
复制代码 |
|