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
第二双 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; }