tyvj1125 JR's chop

描述

JR有很多双筷子。确切的说应该是很多根,因为筷子的长度不一,很难判断出哪两根是一双的。JR家里来了K个客人,JR留下他们吃晚饭。加上JR,JR的girl friend和JR的朋友内涵,共K+3个人。每人需要用一双筷子。JR只好清理了一下筷子,共N根,长度为T1,T2,T3,……,TN.现在他想用这些筷子组合成K+3双,使每双的筷子长度差的平方和最小。

输入格式

输入文件共有两行,第一行为两个用空格隔开的整数,表示N,K(1≤N≤100, 0<K<50),第二行共有N个用空格隔开的整数,为Ti.每个整数为1~50之间的数。

输出格式

输出文件仅一行。如果凑不齐K+3双,输出-1,否则输出长度差平方和的最小值。

测试样例1

输入

10 1 
1 1 2 3 3 3 4 6 10 20

输出

5

备注

第一双 1 1
第二双 2 3
第三双 3 3
第四双 4 6
(1-1)^2+(2-3)^2+(3-3)^2+(4-6)^2=5
 
//chopsticks弱化版

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<algorithm>
using namespace std;
int m,n,a[5005];
long long dp[1005][5005];
int main(){
    cin>>n>>m;
    for(int i = n;i >= 1;i--){
        scanf("%d",&a[i]);
    }
    sort(a+1,a+1+n);
    m += 3;
    for(int i = 1;i <= m;i++){
        for(int j = 1;j <= n;j++){
            if(j < i * 2) dp[i][j] = 9876543212345L;
            else dp[i][j] = min(dp[i][j-1],dp[i-1][j-2] + (a[j] - a[j-1]) * (a[j] - a[j-1]));
        }
    }
    cout<<(dp[m][n] == 9876543212345L ? -1 : dp[m][n]);
    return 0;
}

 

posted @ 2016-08-20 22:25  ACforever  阅读(209)  评论(0编辑  收藏  举报