UVA 10271 Chopsticks

原创 2016年08月29日 14:04:47

题目链接:http://acm.hust.edu.cn/vjudge/problem/19452


题意:将n只筷子分成k份,每份中除去最长的,剩下两个长度相减的平方作为一份的值,求k份筷子的值之和最小。


思路:dp[i][j]表示前i只筷子分为j份和的最小值。我们将筷子从大到小排序。dp[i][j] = min( dp[i-2][j-1] + (a[i-1] - a[i])^2  ) ( 当j*3<= i 时)因为一定可以分成,那么第j组的长筷子就可以从1~i-2里面找没有用过的。


#include <cstdio>
#include <cmath>
#include <cstring>
#include <string>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#include <stack>
#include <map>
#include <set>
#include <vector>
#include <sstream>
#include <queue>
#include <utility>
using namespace std;

#define rep(i,j,k) for (int i=j;i<=k;i++)
#define Rrep(i,j,k) for (int i=j;i>=k;i--)

#define Clean(x,y) memset(x,y,sizeof(x))
#define LL long long
#define ULL unsigned long long
#define inf 0x7fffffff
#define mod 100000007
const int maxn = 5009;
int T;
int n,k;

int a[maxn];
int dp[maxn][3100];

bool cmp(int x,int y)
{
    return x > y;
}

void init()
{
    cin>>k>>n;
    k = k + 8;
    rep(i,1,n) scanf("%d",&a[i]);
    sort(a+1,a+1+n,cmp);
    Clean(dp,0x3f);
    rep(i,0,n) dp[i][0] = 0;
}

int cal( int x , int y )
{
    return (x-y)*(x-y);
}

void solve()
{
    rep(i,3,n)
    {
        int uplim = min( k , i / 3 );
        rep(j,1,uplim)
        {
            dp[i][j] = min( dp[i-1][j] , dp[i][j] );
            if( j * 3 <= i )
                dp[i][j] = min( dp[i][j] , dp[i-2][j-1] + cal( a[i-1] , a[i] ) );
        }
    }
    cout<<dp[n][k]<<endl;
}

int main()
{
    cin>>T;
    while(T--)
    {
        init();
        solve();
    }
    return 0;
}





版权声明:本文为博主原创文章,未经博主允许不得转载。

uva 10271 Chopsticks(dp)

题目连接:10271 - Chopsticks 题目大意:给出m和n, 然后给出n根筷子从小到大给出, 现在要从这n根筷子中选出m + 8组筷子, 每组筷子包括三根, 现在要求所有m + 8组每组...
  • u011328934
  • u011328934
  • 2013年09月13日 13:23
  • 1155

UVa 10271 Chopsticks

题目链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&probl...
  • c21c21
  • c21c21
  • 2015年06月09日 11:15
  • 162

UVA 10271 Chopsticks(线性DP)

In China, people use a pair of chopsticks to get food on the table, but Mr. L is a bit different. He...
  • u013582254
  • u013582254
  • 2015年05月12日 22:53
  • 482

UVA 10271 - Chopsticks

大意:  在中国,众通常用一双筷子吃饭。但是L先生与众不同:他用三支筷子吃饭。其中的一支长筷子用来叉取大块的食物,而剩下两支用作普通筷子。两支普通筷子的长度应尽可能的接近,而长的那支只要是三支中最长...
  • yuzhaoxin1008
  • yuzhaoxin1008
  • 2015年03月16日 14:04
  • 205

UVA 10271 Chopsticks(dp)

题意:给出n只筷子的长度,在其中取k+8组,每组筷子有三根,两根短的一根长的,求各组短筷子长度差的最小的平方和。 解析: 考虑动态规划,那么很容易想到如下的状态定义:dp[i][j]表示用前j...
  • HelloWorld10086
  • HelloWorld10086
  • 2015年01月29日 17:20
  • 437

【DP】UVA 10271 Chopsticks

题意:给出好N只筷子 要求选出K+8组筷子 每组3只筷子并且 A 排序后 选择相邻的一定是最小的,因为还要选一根C要求从大到小选择 #include #include #include #i...
  • u012749539
  • u012749539
  • 2014年11月30日 12:00
  • 491

UVA - 10271 Chopsticks DP

UVA - 10271 这题的状态是第i根筷子是否参与构成第j双,由于存在第三根筷子,需要加限制条件i>=j*3,然后从大到小排序取。状态方程dp[i][j]=min(dp[i-1][j],dp[i...
  • Joyce__Yin
  • Joyce__Yin
  • 2015年08月31日 09:24
  • 260

UVA - 10271 Chopsticks

题意:从n个筷子中选出k+8对(x,y,z)使得总的(x-y)^2最小,切z最大,容易想出dp[i][j]表示前i个筷子中选j对使得权值最小,先确定最终的状态是我们用n个筷子选出k+8组使得权值最小,...
  • u011345136
  • u011345136
  • 2013年09月18日 23:07
  • 546

uva 10271 Chopsticks (DP)

uva 10271 ChopsticksA题目大意:给出客人数K和筷子数量N(支),总人数M=客人数K + 8(还有家人)。要找出M组筷子,每组包括3支筷子,每组都有一个badness值,badnes...
  • llx523113241
  • llx523113241
  • 2015年04月08日 18:50
  • 363

UVA - 10271 Chopsticks 经典DP

题目大意:有K+8个人,每个人要有三支筷子,筷子的大小满足X
  • L123012013048
  • L123012013048
  • 2014年11月15日 00:46
  • 462
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:UVA 10271 Chopsticks
举报原因:
原因补充:

(最多只允许输入30个字)