HDU - 1500 - Chopsticks

先上题目:

Chopsticks

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)
Total Submission(s): 1538    Accepted Submission(s): 715


Problem Description
In China, people use a pair of chopsticks to get food on the table, but Mr. L is a bit different. He uses a set of three chopsticks -- one pair, plus an EXTRA long chopstick to get some big food by piercing it through the food. As you may guess, the length of the two shorter chopsticks should be as close as possible, but the length of the extra one is not important, as long as it's the longest. To make things clearer, for the set of chopsticks with lengths A,B,C(A<=B<=C), (A-B)^2 is called the 'badness' of the set. 
It's December 2nd, Mr.L's birthday! He invited K people to join his birthday party, and would like to introduce his way of using chopsticks. So, he should prepare K+8 sets of chopsticks(for himself, his wife, his little son, little daughter, his mother, father, mother-in-law, father-in-law, and K other guests). But Mr.L suddenly discovered that his chopsticks are of quite different lengths! He should find a way of composing the K+8 sets, so that the total badness of all the sets is minimized.
 

 

Input
The first line in the input contains a single integer T, indicating the number of test cases(1<=T<=20). Each test case begins with two integers K, N(0<=K<=1000, 3K+24<=N<=5000), the number of guests and the number of chopsticks. There are N positive integers Li on the next line in non-decreasing order indicating the lengths of the chopsticks.(1<=Li<=32000).
 

 

Output
For each test case in the input, print a line containing the minimal total badness of all the sets.
 

 

Sample Input
1
1 40
1 8 10 16 19 22 27 33 36 40 47 52 56 61 63 71 72 75 81 81 84 88 96 98 103 110 113 118 124 128 129 134 134 139 148 157 157 160 162 164
 

 

Sample Output
23
Note For the sample input, a possible collection of the 9 sets is: 8,10,16; 19,22,27; 61,63,75; 71,72,88; 81,81,84; 96,98,103; 128,129,148; 134,134,139; 157,157,160
 
  题意:主角有特别的用筷子技巧→_→,喜欢有两个短的且两者的长度差值最小且配上一根长的,现在告诉你需要从n根筷子里面挑k+8组筷子,问你总的每一组短的筷子的长度差值最小。
 
  跟HDU的1421相似,不过这里需要再挑一根长的,这是一个限制条件,所以这里需要从大到小排序,排序完毕,因为我们需要先找到最长的那根筷子,枚举第i跟筷子的时候i从3*j开始,因为对于第j组,极端情况下前面的所有筷子都被选上,那就是从3*j开始枚举。
 
  /**
   * 2014.03.01
   * 这一题还不能完全地理解,需要再想一下。
   * 在其他人的博客上面看的分析不是很懂···看来DP还要加强啊。
   */
 
 
   /**
        * 2014.03.02
        * 请教了一下一个师兄,发现其实在网上看到的那种不明白的赋值其实可以不用,只要在前面初始化的时候将一部分元素初始化为INF,一部分初始化为0(就像解决HDU1421         * 时的情况,这样就没问题了),其实网上的那种不明白的赋值方式也是初始化,不过相对于对全部元素初始化,它只初始化一部分,这样在一定程度上达到优化的目的(个人           * 猜测),不过还不是很懂为什么要那样初始化。
        */
 
上代码:
 
#include <cstdio>
#include <cstring>
#define min(x,y) (x < y ? x : y)
#define INF (1<<30)
#define MAX 1005
using namespace std;

int l[MAX*5];
int dp[MAX*5][MAX];

int main()
{
    int t,n,k;
    memset(dp,0,sizeof(dp));
    //freopen("data.txt","r",stdin);
    scanf("%d",&t);
    while(t--){
        scanf("%d %d",&k,&n);
        for(int i=n;i>=1;i--){
            scanf("%d",&l[i]);
        }
        k+=8;
        int e;
        for(int i=0;i<=n;i++){
            for(int j=1;j<=k;j++){
                dp[i][j]=INF;
            }
        }
        for(int j=1;j<=k;j++){
            int i=j*3;
            for(;i<=n;i++){
                e=(l[i]-l[i-1])*(l[i]-l[i-1]);
                dp[i][j]=min(dp[i-1][j],dp[i-2][j-1]+e);
            }
        }
        printf("%d\n",dp[n][k]);
    }
    return 0;
}
1500

 

posted @ 2014-03-01 16:00  海拉鲁的林克  阅读(394)  评论(0编辑  收藏  举报