static Comparator<Integer> cmp = new Comparator<Integer>(){
public int compare(Integer e1, Integer e2){
return e2-e1; // 降序
}
}
...
Queue<Integer> pq = new PriorityQueue<>(cmp);
当然用取负的方法也是可以的。
代码:
import java.util.PriorityQueue;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
int t;
Scanner scanner = new Scanner(System.in);
t = scanner.nextInt();
while(t>0){
long tot = 0; long add = 0;
PriorityQueue<Long> pqa = new PriorityQueue<>();
int n = scanner.nextInt();
int m = scanner.nextInt();
for(int i =1;i<=n;i++){
long tmp = scanner.nextInt();
pqa.add(tmp);
tot+=tmp;
}
for(int i =1;i<=m;i++){
long b = scanner.nextInt();
add += b-pqa.poll();
pqa.add(b);
}
System.out.println(add+tot);
t--;
}
}
}
总结下,我们依次从大到小放置数字,但每次到达窗口边界(i % k == 0)就放置一个小值(从小到大取),其他位置都从大到小放置大值。复杂度为O(n)。
重要:针对Java的优化:
我的解法复杂度为O(n),面对2e5的数据绰绰有余,于是敲好java代码提交:
import java.util.Scanner;
public class Main {
public static void main(String[] args){
Scanner scanner = new Scanner(System.in);
int t = scanner.nextInt();
while(t>0){
int n = scanner.nextInt(); int k = scanner.nextInt();
int nows = 0, nowb = n+1;
for(int i = 1;i<=n;i++){
if(i%k!=0){
nowb--;
System.out.printf("%d ",nowb);
}else{
nows++;
System.out.printf("%d ",nows);
}
}
System.out.print('\n');
t--;
}
}
}
static PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
...
out.printf("%d ",nowb);
out.println("hello world");
在本题,简单的输出优化就可以使得TLE->AC(374ms),可谓重大优化。
AC代码:
import java.io.BufferedInputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.util.Scanner;
public class Main {
static PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
public static void main(String[] args){
Scanner scanner = new Scanner(new BufferedInputStream(System.in));
int t = scanner.nextInt();
while(t>0){
int n = scanner.nextInt(); int k = scanner.nextInt();
int nows = 0, nowb = n+1;
for(int i = 1;i<=n;i++){
if(i%k!=0){
nowb--;
out.printf("%d ",nowb);
}else{
nows++;
out.printf("%d ",nows);
}
}
out.print('\n');
out.flush();
t--;
}
}
}