zoukankan      html  css  js  c++  java
  • codevs贪吃的九头龙

    传说中的九头龙是一种特别贪吃的动物。虽然名字叫“九头龙”,但这只是说它出生的时候有九个头,而在成长的过程中,它有时会长出很多的新头,头的总数会远大于九,当然也会有旧头因衰老而自己脱落。
    有一天,有M 个脑袋的九头龙看到一棵长有N 个果子的果树,喜出望外,恨不得一口把它全部吃掉。可是必须照顾到每个头,因此它需要把N 个果子分成M组,每组至少有一个果子,让每个头吃一组。
    这M个脑袋中有一个最大,称为“大头”,是众头之首,它要吃掉恰好K个果子,而且K个果子中理所当然地应该包括唯一的一个最大的果子。果子由N-1根树枝连接起来,由于果树是一个整体,因此可以从任意一个果子出发沿着树枝“走到”任何一个其他的果子。
    对于每段树枝,如果它所连接的两个果子需要由不同的头来吃掉,那么两个头会共同把树枝弄断而把果子分开;如果这两个果子是由同一个头来吃掉,那么这个头会懒得把它弄断而直接把果子连同树枝一起吃掉。当然,吃树枝并不是很舒服的,因此每段树枝都有一个吃下去的“难受值”,而九头龙的难受值就是所有头吃掉的树枝的“难受值”之和。
    九头龙希望它的“难受值”尽量小,你能帮它算算吗?
    例如图 1 所示的例子中,果树包含8 个果子,7 段树枝,各段树枝的“难受值”标记在了树枝的旁边。九头龙有两个脑袋,大头需要吃掉4个果子,其中必须包含最大的果子。即N=8,M=2,K=4:
    图一描述了果树的形态,图二描述了最优策略。
    大头吃4个果子,用实心点标识;
    小头吃4个果子,用空心点标识;
    九头龙的难受值为4,因为图中用细边标
    记的树枝被大头吃掉了。

    输入描述 Input Description

    输入文件dragon.in的第1行包含三个整数N (1<=N<=300),M (2<=M<=N),K (1<=K<=N)。 N 个果子依次编号1,2,...,N,且最大的果子的编号总是1。第2行到第N行描述了果树的形态,每行包含三个整数a (1<=a<=N),b (1<=b<=N),c (0<=c<=105),表示存在一段难受值为c的树枝连接果子a和果子b。

    输出描述 Output Description

    输出文件dragon.out 仅有一行,包含一个整数,表示在满足“大头”的要求的前提下,九头龙的难受值的最小值。如果无法满足要求,输出-1。

    样例输入 Sample Input

    8 2 4
    1 2 20
    1 3 4
    1 4 13
    2 5 10
    2 6 12
    3 7 15
    3 8 5

    样例输出 Sample Output

    4

    数据范围及提示 Data Size & Hint

    该样例对应于题目描述中的例子。

    【题目分析】

        大意就是:一条九头龙的动物, 有M个脑袋, 每个脑袋都必须吃到果子, 一棵有N个果子的树, 分配给它每个头吃,      其中一个最大的头要吃K个果子, 其余分配给其它的头, 如果一个头同时吃到相邻的果子会有一个难受值, 现在要你分配果子使得难受值的和最小.

    解题思路:

    无解好判断,N-K<M-1则无解(果子不够吃)。
    有解的情况
    如果能把M个脑袋简化成一个脑袋吃K个的最小代价就好办了。分两种情况:
    1、M=2,就是大头吃掉的树枝+小头吃掉的树枝。
    2、M>2,此时只需考虑大头吃掉的树枝,因为其他的可以根据奇偶分给不同的头吃,从而使他们不被算入最终答案。
    然后就是一个简单的树形DP题,先把树转成二叉树,然后:f[i][j][k]=min{f[lc[i]][X][0]+f[rc[i]][j-X][k]+(m==2)*(k==0)*d[i] || f[lc[i]][X-1][1]+f[rc[i]][j-X][k]+(k==1)*d[i] }f[i][j][k]指以i为根的子树分j个给大头吃,父亲是k(k=1被大头吃k=0被小头吃)。

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<algorithm>
    using namespace std;
    const int MAXN=302;
    const int INF=100000000;
    int n,m,k,tot=0,ans=INF;
    int a[MAXN][MAXN],sum[MAXN];
    int f[MAXN][MAXN][3];
    bool b[MAXN];
    struct node
    {
        int lc,rc,f,d;
    }tree[MAXN];
    void debug(int v)
    {
        printf("%d
    ",v);
        if (tree[v].lc) debug(tree[v].lc);
        if (tree[v].rc) debug(tree[v].rc);
    }
    void debug2(int v)
    {
        if (tree[v].lc) debug(tree[v].lc);
        printf("%d
    ",v);
        if (tree[v].rc) debug(tree[v].rc);
    }
    int dp(int root,int x,int g)
    {
        if (x<0) return INF;
        if (f[root][x][g]>=0) return f[root][x][g];
        if (!root && !x) return f[root][x][g]=0;
        
        f[root][x][g]=INF;
        for (int i=0;i<=min(x,sum[root]);i++)
        {
            int t1=dp(tree[root].lc,i,0)+(m==2)*(g==0)*tree[root].d;
            int t2=dp(tree[root].lc,i-1,1)+(g==1)*tree[root].d;
            int t3=dp(tree[root].rc,x-i,g);
            t1=min(t1,t2);
            f[root][x][g]=min(f[root][x][g],t1+t3);
        }
        return f[root][x][g];
    }
    void Find(int root)
    {
         if (!root) return ;
         Find(tree[root].lc);
         Find(tree[root].rc);
         sum[root]=sum[tree[root].lc]+sum[tree[root].rc]+1;
    }
    int main()
    {
        scanf("%d%d%d",&n,&m,&k);
        for (int i=1;i<n;i++)
        {
            int x,y,d;
            scanf("%d%d%d",&x,&y,&d);
            tree[y].rc=tree[x].lc;
            tree[x].lc=y;
            tree[y].d=d;
        }
        if (n-k<m-1) {printf("-1
    ");return 0;}
        memset(sum,0,sizeof(sum));
        Find(1);
        memset(f,255,sizeof(f));
        printf("%d
    ",dp(tree[1].lc,k-1,1));
        return 0;
    }
  • 相关阅读:
    Web API 强势入门指南
    毫秒必争,前端网页性能最佳实践
    Windbg Extension NetExt 使用指南 【3】 ---- 挖掘你想要的数据 Managed Heap
    Windbg Extension NetExt 使用指南 【2】 ---- NetExt 的基本命令介绍
    Windbg Extension NetExt 使用指南 【1】 ---- NetExt 介绍
    WCF : 修复 Security settings for this service require Windows Authentication but it is not enabled for the IIS application that hosts this service 问题
    透过WinDBG的视角看String
    Microsoft Azure Web Sites应用与实践【4】—— Microsoft Azure网站的“后门”
    企业IT管理员IE11升级指南【17】—— F12 开发者工具
    WCF : 如何将NetTcpBinding寄宿在IIS7上
  • 原文地址:https://www.cnblogs.com/xiaoningmeng/p/5877145.html
Copyright © 2011-2022 走看看