搬宿舍

来源:互联网 发布:淘宝货源免费代销 编辑:程序博客网 时间:2024/04/28 04:22

题:左右手的重量差的平方为疲劳度,对于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]);    } }


0 0
原创粉丝点击