描述
有n只小熊,他们有着不同的战斗力。每次他们吃糖时,会按照战斗力来排。战斗力高的小熊拥有优先选择权。前边的小熊吃饱了,后边的小熊才能吃。每只小熊有一个饥饿值,每次进食时,小熊会选择最大的能填饱自己当前饥饿值的那颗糖来吃,可能吃完没饱会重复上述过程,但不会选择吃撑。
给出n只小熊的战斗力和饥饿值,和m颗糖。
求进食完,每只小熊剩余的饥饿值。
第一行:两个整数,n m分别代表小熊的数量和糖的数量。
第二行:m个整数,糖的能量。
接下来:n行,每行两个整数,分别表示小熊的战斗力和饥饿值。
输入
2 5
5 6 10 20 30(糖值)
4 34(优先级和饥饿值)
5 35
输出
4
0
分析:
- 对战斗力排序的时候,饥饿值也排序。
- 打印的时候,要按原来的顺序打印。所以排序前,还要一个辅助数组记录顺序。
- 最后可以不排序,按索引顺序来打印。
import java.util.Arrays;
import java.util.Scanner;
public class XiaoXiong1 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in );
int n = sc.nextInt();
int m = sc.nextInt();
int suger[] = new int[m];
int[][] panda = new int[n][3];
for(int i=0;i<m;i++){
suger[i] = sc.nextInt();
}
for(int i=0;i<n;i++){
panda[i][0] = sc.nextInt();
panda[i][1] = sc.nextInt();
panda[i][2] = i;
}
for(int i=0;i<n;i++){
for(int j=n-1;j>i;j--){
if(panda[j][0]>panda[j-1][0]){
int temp1 = panda[j][0];
int temp2 = panda[j][1];
int temp3 = panda[j][2];
panda[j][0] = panda[j-1][0];
panda[j-1][0] = temp1;
panda[j][1] = panda[j-1][1];
panda[j-1][1] = temp2;
panda[j][2] = panda[j-1][2];
panda[j-1][2] = temp3;
}
}
}
Arrays.sort(suger);
for(int i=0;i<n;i++){
for(int j=m-1;j>=0;j--){
if(panda[i][1]>=suger[j]){
panda[i][1]-=suger[j];
suger[j] = Integer.MAX_VALUE;
}
}
}
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(panda[j][2]==i){
System.out.println(panda[j][1]);
}
}
}
}
}