电视转播

题目描述:一个电视网络计划转播一场重要的足球比赛。网络中的传输点和接收点(即用户)可以表示一棵树。这棵树的根是一个传输点,它将转播比赛。树的叶节点是可能要接受这场比赛的用户(他当然可以选择不看比赛,这样就不要交款)。其他非根节点,非叶节点的中间节点为数据的中转站。将一个信号从一个传输点传到另一个传输点的花费是给定的。整个转播的费用就是每一个传输费用的总和。每一个用户(叶节点)都准备付一定的钱来看这场比赛。电视网络公司要决定是否要给这个用户提供电视信号。例如:给一个节点传输信息的花费太大,而他愿意的付款也很少时,网络公司可能选择不给他转播比赛。写一个程序,找到一个传输方案使最多的用户能看到转播比赛,且转播的费用不超过所有接收信号用户的交款。

输入格式:输入文件的第一行包含两个整数N和M(2<=N<=3000,1<=M<=N-1)。N,M表示分别表示树的节点数和想观看比赛的用户数。树的根节点用1表示,中间节点的标号为2~N-M,用户的节点标号为N-M+1~N。接下来的N-M行表示传输点的信息(依次是节点1,2……): K A1 C1 A2 C2 …… Ak Ck 表示一个传输点将信号传给K个用户,每一个包含两个数A和C,A表示传输点或用户的节点号,C表示传输的花费。最后一行含有用户的数据,有M个整数表示他们看这场比赛愿意的付费。

输出格式:仅一行包含一个整数,最大的用户数

1.多叉转二叉方法:

#include <iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#define MAXN 3005
using namespace std;
int haveson[MAXN];
int cnt[MAXN];
int n,m;
bool vis[MAXN];
struct node
{
    int cost,ch[2];
    node(){cost=0,ch[0]=ch[1]=0;}
}tree[MAXN];
int f[MAXN][MAXN];
void dp(int root)
{
    if(tree[root].ch[0])
        dp(tree[root].ch[0]);
    else f[root][1]=max(f[root][1],tree[root].cost);
    if(tree[root].ch[1])
        dp(tree[root].ch[1]);
    f[root][0]=max(f[root][0],0);
    if(tree[root].ch[0])
    {
    for(int i=1;i<=cnt[root];i++)
    {
        for(int k=0;k<=i&&k<=cnt[tree[root].ch[0]];k++)
           f[root][i]=max(f[root][i],f[tree[root].ch[0]][k]+f[tree[root].ch[1]][i-k]+tree[root].cost);
       if(i<=cnt[tree[root].ch[1]])
        f[root][i]=max(f[root][i],f[tree[root].ch[1]][i]);
    }
    }
    else
    {
        for(int i=1;i<=cnt[root];i++)
            {f[root][i]=max(f[root][i],f[tree[root].ch[1]][i-1]+tree[root].cost);
            f[root][i]=max(f[root][i],f[tree[root].ch[1]][i]);
            }
    }
}
void dfs(int root)
{
    vis[root]=1;
    if(!tree[root].ch[0])
    {cnt[root]=1;
    }
    else
    {dfs(tree[root].ch[0]);
     cnt[root]+=cnt[tree[root].ch[0]];
    }
    if(tree[root].ch[1])
    {dfs(tree[root].ch[1]);
    cnt[root]+=cnt[tree[root].ch[1]];
    }
    vis[root]=0;
}
int main()
{
    int k,t1,t2;
    scanf("%d%d",&n,&m);
    memset(f,0x80,sizeof f);
    for(int i=0;i<=n;i++)
        f[i][0]=0;

    for(int i=1;i<=n-m;i++)
    {
        scanf("%d",&k);
        for(int j=1;j<=k;j++)
        {
            scanf("%d%d",&t1,&t2);
            if(haveson[i])
            tree[haveson[i]].ch[1]=t1;
            else
            tree[i].ch[0]=t1;
             haveson[i]=t1;
            tree[t1].cost=-t2;
        }
    }
    for(int i=n-m+1;i<=n;i++)
    {
        scanf("%d",&t1);
        tree[i].cost+=t1;
    }
    dfs(1);
    dp(1);
    for(int i=m;i>=0;i--)
    if(f[1][i]>=0)
    {
        printf("%d\n",i);
        return 0;
    }
    return 0;
}

  

2.背包方法:将dfs序搜索的节点的组合做成背包,当前访问的节点加入或不加入背包。

#include <iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<vector>
#define MAXN 3005
using namespace std;
int cost[MAXN],cnt[MAXN];
const int INF=0x80808080;
vector<int> fir[MAXN];
int n,m,k;
bool vis[MAXN];
int f[MAXN][MAXN];
void dfs1(int root)
{
    if(fir[root].size()==0){cnt[root]=1;return;}
    for(int i=0;i<fir[root].size();i++)
    {
        int u=fir[root][i];
        dfs1(u);
        cnt[root]+=cnt[u];
    }
}
void dfs2(int root)
{
    for(int i=0;i<fir[root].size();i++)
    {
        int u=fir[root][i];
        for(int j=0;j<=m;j++)
        {
            if(f[root][j]>INF)
            f[u][j]=f[root][j];
        }
        if(fir[u].size())
        dfs2(u);
        int dd=0;
        for(int j=0;j<=m;j++)
        {
            if(fir[u].size()==0)dd=1;
            else dd=0;
           if(f[u][j]+cost[u]>=f[root][j+dd])
            f[root][j+dd]=f[u][j]+cost[u];
        }
    }
}
int main()
{
    scanf("%d%d",&n,&m);
    int t1,t2;
    for(int i=1;i<=n-m;i++)
    {
        scanf("%d",&k);
        for(int j=1;j<=k;j++)
        {
            scanf("%d%d",&t1,&t2);
            fir[i].push_back(t1);
            cost[t1]=-t2;
        }
    }
    int tmp;
    for(int i=n-m+1;i<=n;i++)
        {scanf("%d",&tmp);
         cost[i]+=tmp;
        }
        memset(f,0x80,sizeof f);
        for(int i=0;i<=n;i++)
            f[i][0]=0;
    dfs1(1);
    dfs2(1);
    for(int i=m;i>=0;i--)
        if(f[1][i]>=0)
        { printf("%d",i);
           return 0;
        }
        return 0;
}

  

3.另一种背包:

自底向上,将每棵子树做成背包,再合并子树的背包,加上父亲节点。背包合并时是N^2,总的时间复杂度是O(N^3)。然而实际运行时比第二种方法还要快。

#include <iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<vector>
#define MAXN 3005
const int INF=0x80808080;
using namespace std;
vector<int> fir[MAXN];
int cnt[MAXN];
int cost[MAXN],n,m,t1,t2,k;
int f[MAXN][MAXN];
void dfs(int root)
{
    for(int i=0;i<fir[root].size();i++)
    {
        int u=fir[root][i];
        if(fir[u].size())
        dfs(u);
        else
        {
            f[u][1]=cost[u];
            cnt[u]=1;

        }
        cnt[root]+=cnt[u];
        for(int k=cnt[root];k>=0;k--)
            {if(f[root][k]>INF)
              {for(int j=0;j+k<=cnt[root]&&j<=cnt[u];j++)
                if(f[u][j]>INF&&f[root][j+k]<f[root][k]+f[u][j])
                    f[root][j+k]=f[root][k]+f[u][j];
                }
            }
    }
    for(int i=1;i<=cnt[root];i++)
        if(f[root][i]>INF)f[root][i]+=cost[root];
}
int main()
{
  memset(f,0x80,sizeof f);
  scanf("%d%d",&n,&m);
  for(int i=1;i<=n-m;i++)
  {
      scanf("%d",&k);
      for(int j=1;j<=k;j++)
      {
          scanf("%d%d",&t1,&t2);
          cost[t1]=-t2;
          fir[i].push_back(t1);
      }
  }
  for(int i=n-m+1;i<=n;i++)
  {
      scanf("%d",&t1);
      cost[i]+=t1;
  }
  for(int i=0;i<=n;i++)
    f[i][0]=0;
  dfs(1);
  for(int i=m;i>=0;i--)
    if(f[1][i]>=0)
   { printf("%d",i);
   return 0;
   }
}

  

时间: 2024-08-25 23:14:23

电视转播的相关文章

奥运转播加速上云,北京冬奥组委测试阿里云视频传输技术

摘要: 10月11日晚,北京冬奥组委与国际奥林匹克转播机构进行了云视频传输技术测试,工作人员通过阿里云传输技术,对布宜诺斯艾利斯青奥会多个项目进行多路电视转播测试,监测了实时传播的画面清晰度.延时等指标,并模拟了整套体育赛事远程视频制作流程. 10月11日晚,北京冬奥组委与国际奥林匹克转播机构进行了云视频传输技术测试,工作人员通过阿里云传输技术,对布宜诺斯艾利斯青奥会多个项目进行多路电视转播测试,监测了实时传播的画面清晰度.延时等指标,并模拟了整套体育赛事远程视频制作流程. 在接受北京电视台采访

英语用法指南 Practical English Usage

1. abbreviated styles  简略的文体 有些书面语和口语的文体有其特殊的语法规则,这往往是因为需要节省篇幅或时间. @ 广告和说明书 简短的广告和说明书往往省略冠词.作主语或宾语的代词.be的各种形式和介词. Single man looking for flat Oxford area. Please 806127 weekends. 单身男子在牛津区寻求住房一套.请于周末致电806127. Job needed urgently. Will do anything lega

腾讯、阿里、万达都想收购的股权

作者:楠沨 [IT战略家] 据悉,Imagina主要股东之一将出售23%的股权(该股东具体信息暂未公布),交易价值估计约5亿欧元.参与本次竞购的除了阿里巴巴旗下阿里体育.腾讯.万达以外,还有光大证券.北京暴风.私募基金CVC.法国媒体集团Vevendi.美国媒体巨头Liberty Media,以及西班牙电信等.在体育产业领域内,从赛事转播权到赛事IP的争相布局已经开始. 2015年以来,体育行业成为投资热点.一方面是整体居民生活水平的提高,一方面也得益于国家政策的推动和资本的刺激.巨头争相布局.

试论大型体育比赛对城市经济社会及体育的有益影响

在全球化背景下,由于经济转型.科技进步等因素的影响,城市之间的竞争日趋激烈,举办国际或国家级体育赛事已成为了我国各大城市和中小城市塑造城市形象.提升城市知名度.促进城市发展的重要手段.尤其是 2008 年北京奥运会的成功举办,掀起了我国城市举办各级体育赛事的热潮.随后举办的第 11 届全运会.第 7 届城运会.第16 届亚运会.第 12 届全运会等国家级或洲际级大型体育等赛事分别在济南.南昌.广州.沈阳等城市成功举办,世界一级方程式赛车锦标赛 ( F1) .美国职业篮球联赛( NBA) 海外赛.

台湾军方再爆染毒te

我去了不多久,国家开始整顿经济过热.我给大家说,我来不是烧"三把火"的,而是来泼"三盆水"的.再有,我也不是三头六臂,不可能把厦门的优惠政策转到宁德.我们不要想干一夜暴富的事情,也没那个条件,但我们不能输在精神上,人穷志不穷.我给宁德的定位就是弱鸟先飞.滴水穿石.不耻落后.只要锲而不舍,最后总能够旧貌换新颜.到宁德后,我到省里开会,总是坐第一排,争着第一个发言.扶贫扶志,贫困地区缺"精气神"不行.我在宁德的一些讲话,后来编成一本书叫<摆脱贫

国政协委员李b

李爱武指出,汨罗有独具特色的综合优势,有极为清晰的发展思路,有奋勇争先的坚强决心,忧患意识强.使命意识强.实干意识强,来势很好. 时刻新闻记者 杨烊 卢杨屾 综合报道 2.花车巡游车身广告体现"总冠名单位"及其LOGO: 长沙市地税局党组书记.局长方志平表示,过去一年,长沙地税局积极应对实体经济下行.主体税种缺位.征管手段乏力等不利因素影响,坚持依法治税,注重分析挖潜,严格征查堵漏,地税收入保持稳健增长:积极应对营改增变化,扎实做好征管转型工作,为地税事业持续发展夯基固本:大力实施&q

丑闻:海军士ja

刘建伟认为,这些城市因地制宜.因城施策实施房地产调控政策以来,市场变化明显,房价持续趋稳回落.1月份,11个城市新建商品住宅价格环比下降,降幅在0.1至0.5个百分点之间:3个城市环比持平:广州环比上涨0.6%,涨幅已连续4个月回落. 来自工商联代表队的参赛选手说,资源节约和环境友好对企业来说也是责任和义务,从古诗词的蓝天白云的意境里,我们也感受到建设两型社会的意义重大.东湖街道相关负责人介绍,此次两型诗词大会也是东湖街道龙马社区市级两型宣教基地的首场活动,今后还将面向居民开展各种多寓教于乐.贴

搓球也疯狂(马凯旋)

几乎所有业余选手,都在为改进接发球而费尽心机.其实,接发球的好坏很大程度上取决于搓球的好坏.初学者练球,往往都是从正手攻球开始,然后直拍反手推挡.横拍反手快拨,年轻球迷甚至快攻练习的过程很短,很快就过渡到拉球的阶段.许多人练球到“痴迷”的程度,看电视转播.技术录像,读技术文章.专家指导,再悉心观察身边“高手”如何打球……问题在于,即使是这样的投入,与专业训练相比,也不够系统化.比如说,大多数人都喜欢练板爆冲,看上去既潇洒,打起来又过瘾,然而,在实战接发球中,这种爆冲的机率其实远远低于搓球.笔者将

提供强大科技支撑n

第三,激活了整个玉米产业链.随着玉米价格随行就市,深加工企业成本降低,产业上下游价格关系逐渐理顺,企业开工率持续回升,有些玉米深加工企业称"迎来了好多年都没有的春天".目前东北地区玉米深加工开工率已接近饱和状态.玉米淀粉.酒精等加工品还出现出口大幅增长.一些企业已开始扩大产能,增强了主产区经济发展活力. 随后戚军在谈到本场赛事的时候表示,本场比赛是里皮接手男足国家队帅位后的第二个十二强主场比赛.虽然目前我们国家队的出线形势严峻,但只要有一线希望我们都不会放弃.而且自2005年以来,国足