题:左右手的重量差的平方为疲劳度,对于n个物体,求其中k对物品的最小疲劳度.
这个问题好奇怪,我用java写的总是WR(简直CTM,搞到2:30才发现jobdu上测试用例不只一组,需要while(scaner.hasnext()),再说一次,C ,T , M!!!!!!!!!!!)。代码如下:
版本1:
import java.util.Arrays;
import java.util.Scanner;
public class banqinshi{
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int k = scanner.nextInt();
int[] a = new int[n + 1];
for (int i = 1; i <= n; i++) {
a[i] = scanner.nextInt();
}
Arrays.sort(a);
int[][] mink = new int[k + 1][n + 1];
for (int i = 1; i <= k; i++) {
for (int j = 2 * i; j <= n; j++) {
if(j>2*i)mink[i][j]=mink[i][j-1];
else mink[i][j] = Integer.MAX_VALUE;
if(mink[i][j]>(mink[i - 1][j - 2] + (a[j - 1] - a[j]) * (a[j - 1] - a[j])))
mink[i][j]=(mink[i - 1][j - 2] + (a[j - 1] - a[j]) * (a[j - 1] - a[j]));
}
}
System.out.println(mink[k][n]);
}
}
版本2:
import java.util.Arrays;
import java.util.Scanner;
public class Main{
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int n = scanner.nextInt();
int k = scanner.nextInt();
int[] a = new int[n + 1];
for (int i = 1; i <= n; i++) {
a[i] = scanner.nextInt();
}
Arrays.sort(a);
int[][] mink = new int[k + 1][n + 1];
for (int i = 0; i <= n; i++) {
mink[0][i] = 0;
}
for (int i = 1; i <= k; i++) {
for (int j = 2 * i; j <= n; j++) {
if ( j == 2*i)
mink[i][j] = (a[2*i-1] - a[2*i]) * (a[2*i-1] - a[2*i])+mink[i-1][j-2];
else {
mink[i][j] = (mink[i - 1][j - 2] + (a[j - 1] - a[j]) * (a[j - 1] - a[j])) > mink[i][j - 1]
? mink[i][j - 1] : (mink[i - 1][j - 2] + (a[j - 1] - a[j]) * (a[j - 1] - a[j]));
}
}
}
System.out.println(mink[k][n]);
}
}