【♂Not The Triumph♂O(∩_∩)O哈哈~But The Struggle♂】

竞赛决不是捷径,它只是另一种艰辛的生活方式。得到与失去,只有时间会去评判;成功与失败,只有历史能去仲裁。我不会永远成功,正如我不会永远失败一样

  C++博客 :: 首页 :: 联系 ::  :: 管理
  6 Posts :: 239 Stories :: 25 Comments :: 0 Trackbacks

常用链接

留言簿(7)

我参与的团队

搜索

  •  

积分与排名

  • 积分 - 108466
  • 排名 - 229

最新评论

阅读排行榜

评论排行榜

【问题描述】

A先生有很多双筷子。确切的说应该是很多根,因为筷子的长度不一,很难判断出哪两根是一双的。这天,A先生家里来了K个客人,A先生留下他们吃晚饭。加上A先生,A夫人和他们的孩子小A,共K+3个人。每人需要用一双筷子。A先生只好清理了一下筷子,共N根,长度为T1,T2,T3,……,TN。现在他想用这些筷子组合成K+3双,使每双的筷子长度差的平方和最小。(怎么不是和最小??这要去问A先生了,呵呵)

 

【输入文件】

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

 

【输出文件】

输出文件仅一行。如果凑不齐K+3双,输出-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


分析:状态定义:F[i][j]:j个人准备i双筷子的最小平方差和。
            F[i][j]=max(f[i-1][j],f[i-2][j-1]+a[i]-(a[i-1])^2)

【参考程序】:
#include<string.h>
#include
<stdlib.h>
#include
<stdio.h>
long a[101],f[101][54];
long n,k;
void ssort()
{
     
long tt;
     
for (int i=1;i<=n-1;i++)
        
for (int j=n;j>=i+1;j--)
          
if (a[j]<a[j-1])
          {
                tt
=a[j];a[j]=a[j-1];a[j-1]=tt;
          }
}
int main()
{
        scanf(
"%ld%ld",&n,&k);
        
if (n<(k+3)*2
        {
              printf(
"-1\n");
              exit(
0);
        }
        
for (int i=1;i<=n;i++) scanf("%ld",&a[i]);
        ssort();
        
for (int i=0;i<=n;i++)
            
for (int j=0;j<=k+3;j++)
                f[i][j]
=0xfffffff;
        f[
0][0]=0;
        
//f[i][j]:i支筷子组成j个人的最小平方差和
        for (int i=1;i<=n;i++)
            
for (int j=1;j<=k+3;j++)
                
if (i>=j*2)
                { 
//假设i支筷子不用那么就由i-1去制造j个人需要的筷子数
                    long x=f[i-1][j],
                            y
=f[i-2][j-1]+(a[i]-a[i-1])*(a[i]-a[i-1]);
                    
//当前要多一个人那么就需要i跟i-1组合成一对个第j个人+平方差和
                    if (x<f[i][j]) f[i][j]=x;
                    
if (y<f[i][j]) f[i][j]=y;
                }
        printf(
"%ld\n",f[n][k+3]);
        system(
"pause");
        
return 0;
}
posted on 2009-04-13 10:34 开拓者 阅读(727) 评论(1)  编辑 收藏 引用 所属分类: 动态规划&背包经典习题

Feedback

# re: 【筷子(Chop)】 2016-03-27 16:56
#include<cmath>
#include<cstring>
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;
int f[101][101],n,k,a[101],tot=0;
int main()
{
//freopen("jh.in","r",stdin);
memset(f,0x7f,sizeof(f));
scanf("%d%d",&n,&k);
for(int i=1;i<=n;i++)
scanf("%d",&a[i]);
if(n<2*(k+3))
{
printf("-1");
return 0;
}
sort(a+1,a+n+1);
for(int i=1;i<=2*k+5;i+=2)
tot+=pow((a[i+1]-a[i]),2);
printf("%d",tot);
return 0;
}  回复  更多评论
  


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理