有个疑问,B题按照你的思路写的,但是有个小细节搞不明白,就是下面注释的那行代码,为什么不加max[i+1][j]>min[i][j]判断就会WA,我感觉不需要加也能AC。 是不是OJ有啥Corner case?多谢
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n=sc.nextInt(), k=sc.nextInt();
long[]a=new long[n];
for(int i=0;i<n;i++)a[i]=sc.nextLong();
long[][]min=new long[n][k], max=new long[n][k];
for(int i=0;i<n;i++) Arrays.fill(min[i], Long.MAX_VALUE);
for(int i=0;i<n;i++) Arrays.fill(max[i], Long.MIN_VALUE);
PriorityQueue<Long>pq=new PriorityQueue<Long>();
for(int i=0;i<n;i++) {
pq.add(a[i]);
List<Long>tmp=new ArrayList<Long>();
for(int j=0;j<Math.min(i+1, k);j++) {
long t = pq.remove();
tmp.add(t);
min[i][j]=((j==0?0:min[i][j-1])+t);
}
for(long t:tmp) pq.add(t);
}
PriorityQueue<Long>pq2=new PriorityQueue<Long>();
for(int i=n-1;i>=0;i--) {
pq2.add(-a[i]);
List<Long>tmp=new ArrayList<Long>();
for(int j=0;j<Math.min(n-i, k);j++) {
long t = pq2.remove();
tmp.add(t);
max[i][j]=((j==0?0:max[i][j-1])-t);
}
for(long t:tmp) pq2.add(t);
}
long res = Long.MIN_VALUE, sum = 0;
for(int i=0;i<n;i++) {
sum += a[i];
res = Math.max(res, sum);
for(int j=0;j<Math.min(i+1, k);j++) {
if(i+1<n && max[i+1][j]>min[i][j]) // **为什么这里需要额外判断一下max[i+1][j]>min[i][j]才能AC**
res = Math.max(res, sum-min[i][j]+max[i+1][j]);
}
}
System.out.println(Math.max(res, 0));
}
本次比赛个人解答,还算详细