解题思路
对小熊战斗力进行排序,糖果填充的饥饿值进行排序
遍历小熊,对其需要的饥饿值在谈糖果中进行二分查找,查找的终止条件为,找到小于等于当最接近小熊需要饥饿值得数字,然后小熊的需要饥饿值减去糖果可以提供的值,如果差值大于0,则继续二分查找,知道二分查找返回-1或者是小熊饥饿值为0。在这里不通过二分直接循环遍历糖果值也是可以AC的。
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;
import java.util.Scanner;
public class Main {
static class Compare1 implements Comparator<Bear> {
@Override
public int compare(Bear o1, Bear o2) {
// TODO Auto-generated method stub
return o1.fighting > o2.fighting ? -1 : (o1.fighting < o2.fighting ? 1 : 0);
}
}
static class Compare2 implements Comparator<Bear> {
@Override
public int compare(Bear o1, Bear o2) {
// TODO Auto-generated method stub
return o1.seq > o2.seq ? 1 : (o1.seq < o2.seq ? -1 : 0);
}
}
static class Bear {
int hunger;
int fighting;
int seq;
}
// 二分查找
public static int find(List<Integer> array, int num) {
int low = 0;
int high = array.size() - 1;
if (array.get(high) <= num)
return high;
while (low <= high) {
int mid = (low + high) / 2;
if (mid != array.size() - 1 && array.get(mid) <= num && array.get(mid + 1) > num) {
return mid;
}
if (num > array.get(mid)) {
low = mid + 1;
} else if (num < array.get(mid)) {
high = mid - 1;
}
}
return -1;
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = sc.nextInt();
int m = sc.nextInt();
List<Integer> candies = new ArrayList<>();
for (int i = 0; i < m; i++) {
candies.add(sc.nextInt());
}
Bear[] bears = new Bear[n];
for (int i = 0; i < n; i++) {
Bear bear = new Bear();
bear.fighting = sc.nextInt();
bear.hunger = sc.nextInt();
bear.seq = i;
bears[i] = bear;
}
Collections.sort(candies);
Arrays.sort(bears, new Compare1());
for (int i = 0; i < n; i++) {
int hunger = bears[i].hunger;
int a = 0;
while (hunger > 0 && (a = find(candies, hunger)) != -1) {
hunger -= candies.get(a);
candies.remove(a);
}
bears[i].hunger = hunger;
}
Arrays.sort(bears, new Compare2());
for (int i = 0; i < n; i++) {
System.out.println(bears[i].hunger);
}
}
}