vijos1642 班长的任务

背景
十八居士的毕业典礼(1)
描述
福州时代中学2009届十班同学毕业了,于是班长PRT开始筹办毕业晚会,但是由于条件有限,可能每个同学不能都去,但每个人都有一个权值,PRT希望来的同学们的权值总和最大。
十班有一个周密的电话通知网络,它其实就是一棵树,根结点为班长PRT,由她来负责通知她的下线(也就是儿子节点),下线们继续通知自己的下线(不一定每个下线都要通知),任何人都可以不去:”
为了使权值总和最大,班长想安排一下人,但是人数很多,人脑是难以应付的,所以她找到十八居士,让他编程用电脑解决。

输入格式
输入第一行两个整数n,m表示有n位同学,至多只能去m位同学。(1<=m<=n)
接下来2*n行,每两行代表一个同学的信息(如果这位同学没有子节点,就只有一行)。
每个同学的第一行两个整数p,s,表示这位同学权值为p,子节点个数s;(-100<=p<=100)
第二行s个整数,表示这位同学的子节点的编号。
班长的编号一定为1。
对于20%数据1<=n<=10
对于60%数据1<=n<=100
对于100%数据1<=n<=1000
输出格式
输出一个整数,表示权值的最大值。

样例输入1
8 5
100 2
2 3
79 2
4 5
109 3
6 7 8
100 0
100 0
100 0
101 0
108 0

样例输出1
518

做后感:这题挂了……挂了一个小时没调出来,就不做了……

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;

int n,m;
int tot=0;
int f[1001][1001];
int w[1001];
struct node{
    int l,r;
}a[1001];

int read()
{
    char ch=getchar();
    while (ch<‘0‘ || ch>‘9‘) ch=getchar();
    int x=0;
    while (ch>=‘0‘ && ch<=‘9‘) { x=x*10+ch-‘0‘; ch=getchar();    }
    return x;
}

void insert(int x,int y)//左儿子右兄弟,多叉转二叉
{
    if (a[x].l==0) a[x].l=y;
      else
      {
          int p=a[x].l;
          while (a[p].r!=0) p=a[p].r;
          a[p].r=y;
      }
    return;
}

void dp(int k,int m)
{
    if (k==0 || m==0) { f[k][m]=0; return; }
    if (f[k][m]!=-1) return;
    dp(a[k].r,m);
    f[k][m]=f[a[k].r][m];
    for (int i=0; i<m; i++)
    {
        dp(a[k].l,i); dp(a[k].r,m-i-1);
        f[k][m]=max(f[k][m],f[a[k].l][i]+f[a[k].r][m-i-1]+w[k]);
    }
    return;
}

int main()
{
    n=read(); m=read();
    for (int i=1; i<=n; i++)
    {
        w[i]=read(); int q=read();
        for (int j=1; j<=q; j++)
        {
            int t=read();
            insert(i,t);
        }
    }
    memset(f,-1,sizeof(f));
    dp(1,m);
    cout << f[1][m] << endl;
    return 0;
}
时间: 2024-12-16 15:55:25

vijos1642 班长的任务的相关文章

第11周项目2储存班长信息的学生类

/* *Copyright (c) 2016,烟台大学计算机学院 *All rights reserved. *文件名称 : *作 者 : 刘云 *完成日期 : 2016年5月8号 *版 本 号 : v6.0 * *问题描述 : 储存班长信息的学生类 *输入描述 : 无 *程序输出 : */ #include<iostream> using namespace std; class Stu //声明基类 { public: Stu(int n, string nam ); //基类构造函数 v

十一周 存储班长信息的学生类

#include <iostream> using namespace std; class Stu //声明基类 { public: Stu(int n, string nam ); //基类构造函数 void display( ); //成员函数,输出基类数据成员 protected: //(*)访问权限为保护型的数据成员 int num; //学生学号 string name; //学生姓名 }; class StuDetail: public Stu //声明派生类StuDetail

五个候选班长,20人投票。(输入1-5来表示支持哪个人)最后查看票数,看那个人胜出

for (; ; ) { Console.WriteLine("班长投票选举(1-5)"); Console.WriteLine("请选择你要投票的人:"); Console.WriteLine("1.张三"); Console.WriteLine("2.李四"); Console.WriteLine("3.王五"); Console.WriteLine("4.马六"); Console

15-07-08 数组-- 投票选班长

每班共有20个学生,投票选班长,总共有5个候选人,实现投票,并计算出得票最多的人以及他的票数 int [] tp = new int [20]; //每个人投的票 int [] ps = new int[5]; //每个人所得的票数 //投票 for (int i = 0; i < tp.Length; i++) { Console.WriteLine("支持一号请按1,支持二号请按2,支持三号请按3,支持四号请按4,支持五号请按5"); tp[i] = Convert.ToIn

投票选班长

static void Main46投票选班长(string[] args) { ////某班有20个学生,投票选班长,总共有5个候选人,实现投票,并且计算出得票最多的人以及他的票数. int[] tp = new int[20]; //每个人投的票 int[] ps = new int[5]; //每个候选人所得票数 for (int i = 0; i < tp.Length; i++) { Console.WriteLine("请投票,1代表第一个候选人,2代表第二个候选人--5带表第

C# 5 break continue 球员成绩 彩票 选班长

    二.新课: 1.break与continue. 这两个关键字一般放在循环的花括号里面使用. break--结束整个循环. continue--结束本次循环,进入下次循环. break的案例:     int i = 1;     for(;;)     {         if(i>100)         {             break;         }         Console.Write(i+"\t");         i++;     } co

[vijos]P1642 班长的任务

背景 十八居士的毕业典礼(1) 描述 福州时代中学2009届十班同学毕业了,于是班长PRT开始筹办毕业晚会,但是由于条件有限,可能每个同学不能都去,但每个人都有一个权值,PRT希望来的同学们的权值总和最大. 十班有一个周密的电话通知网络,它其实就是一棵树,根结点为班长PRT,由她来负责通知她的下线(也就是儿子节点),下线们继续通知自己的下线(不一定每个下线都要通知),任何人都可以不去:”为了使权值总和最大,班长想安排一下人,但是人数很多,人脑是难以应付的,所以她找到十八居士,让他编程用电脑解决.

js小案例:5同学投票竞选班长

<script>var array1=new Array();var array2=new Array();for(var i=0;i<5;i++){ array1[i]=0; array2[i]=1;}for(var i=1;i<5;i++){ array2[i]=parseInt(array2[i-1])+1; }var fei=0;var piao=0;for(var i=0;i<20;i++){ var value=prompt("第"+(i+1)

vijos 1642 班长的任务 树形dp

P1642班长的任务 背景 十八居士的毕业典礼(1) 描述 福州时代中学2009届十班同学毕业了,于是班长PRT开始筹办毕业晚会,但是由于条件有限,可能每个同学不能都去,但每个人都有一个权值,PRT希望来的同学们的权值总和最大. 十班有一个周密的电话通知网络,它其实就是一棵树,根结点为班长PRT,由她来负责通知她的下线(也就是儿子节点),下线们继续通知自己的下线(不一定每个下线都要通知),任何人都可以不去:” 为了使权值总和最大,班长想安排一下人,但是人数很多,人脑是难以应付的,所以她找到十八居