题意:给出n个数,你可以将数组内的每一个数换成1~k里面的任何一个数字,使得a[i]+a[n-i+1]为一个定值,求操作的最小次数
思路:
通过维护差分数组,找到每个定值所需要操作的最小次数
每去一组数据对差分数组处理
sum=a[i]+a[n-i+1];
minn=Math.min(a[i],a[n-i+1]);
maxn=sum-minn;
共有四种情况:
- 当a[i]、a[n-i+1]都大于定值时:需要操作两次
- 当a[i]+a[n-i+1]==定值:不需要操作
- 当a[i]、a[n-i+1]都加上k小于定值时操作两次
- 当a[i]+a[n-i+1]大于或小于定值,且不满足上面的情况,只需要操作一次
所以有以下代码:
arr[2]+=2;
arr[minn+1]--;
arr[maxn+k+1]++;
arr[sum]--;
arr[sum+1]++;
AC代码:
package 练习;
import java.io.*;
import java.math.BigInteger;
import java.util.*;
public class Main {
static Scanner sc=new Scanner(System.in);
public static void main(String[] args) {
for(int t=sc.nextInt();t>0;t--) {
show();
}
}
private static void show() {
int n=sc.nextInt();
int k=sc.nextInt();
int a[]=new int [n+1];
int arr[]=new int [2*(k+1)+1];
int sum,minn,maxn;
for(int i=1;i<=n;i++) {
a[i]=sc.nextInt();
if(i>n/2){
sum=a[i]+a[n-i+1];
minn=Math.min(a[i],a[n-i+1]);
maxn=sum-minn;
arr[2]+=2;
arr[minn+1]--;
arr[maxn+k+1]++;
arr[sum]--;
arr[sum+1]++;
}
}
int ans=arr[2];
///System.out.println(Arrays.toString(arr));
for(int i=3;i<=2*k;i++){
arr[i]+=arr[i-1];
ans=Math.min(arr[i],ans);
}
System.out.println(ans);
}
}