要求的是通过所以关卡所获得的最大可能值
所以就存在第一个讨论:
(1)是先做普通的关卡再做特殊的关卡
(2)还是先做特殊的关卡再做普通的关卡
很明显用(1)的做法会大于(2),即先做普通的关卡再做特殊的关卡。
综上,得出是做(1)的结论后,我们再讨论另一个问题
是升序去处理特殊关卡来做
还是降序去处理特殊关卡来做
可以得出,是降序情况来做会更好,降序即先将大的数字加起来,再将小的加起来,优先考虑加大的数,所以需要降序去处理。
这样确保处理后的值是最大值,由于先做普通的再去做特殊的可以将特殊的数覆盖掉,是两倍的基数,这样处理确保的是最大值。有点类似滚雪球,尽可能确保滚到的雪球较大。
import java.util.*;
public class Main{
public static void main(String []args){
Scanner in =new Scanner(System.in);
//比较器排序
Queue<Integer> queue = new PriorityQueue<>(new Comparator<Integer>() {
public int compare(Integer o1, Integer o2) {
return -Integer.compare(o1, o2);
}
});
int arr[]=new int[110];
boolean st[]=new boolean[110];
int n=in.nextInt();
int m=in.nextInt();
for(int i=1;i<=n;i++)arr[i]=in.nextInt();
for(int i=1;i<=m;i++){
int a=in.nextInt();
st[a]=true;
queue.add(arr[a]);
}
long res=0;
for(int i=1;i<=n;i++){
if(!st[i])res+=arr[i];
}
while(!queue.isEmpty()){
int x=queue.poll();
//排完序的queue依次出队
if(res>=x)res*=2;
else res=res+x;
}
System.out.println(res);
}
}