zoukankan      html  css  js  c++  java
  • BZOJ4027: [HEOI2015]兔子与樱花 贪心

    觉得是贪心,但是一开始不太肯定。。。然后就A了

    一个点对它的父亲的贡献就是自己的权值加儿子的个数

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 int read(){
     4   int x=0,f=1;char ch=getchar();
     5   while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
     6   while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
     7   return x*f;
     8 }
     9 #define N 2000005
    10 int n,m,v[N],son[N],ans=0;
    11 struct Node{
    12   int to,next;
    13 }e[N];
    14 int tot,head[N];
    15 void add(int x,int y){
    16   e[++tot]=(Node){y,head[x]};head[x]=tot;
    17 }
    18 int dfs(int x){
    19   if(!head[x])return v[x];
    20   int top=0,q[son[x]];
    21   for(int i=head[x];i;i=e[i].next){
    22     q[top++]=dfs(e[i].to);
    23   }
    24   sort(q,q+top);
    25   for(int i=0;i<top;i++)if(v[x]+q[i]+son[x]-1<=m)son[x]--,v[x]+=q[i],ans++;
    26   return v[x]+son[x];
    27 }
    28 int main(){
    29   n=read();m=read();
    30   for(int i=1;i<=n;i++)v[i]=read();
    31   for(int i=1;i<=n;i++){
    32     son[i]=read();
    33     for(int j=1;j<=son[i];j++){
    34       int x=read()+1;
    35       add(i,x);
    36     }
    37   }
    38   dfs(1);
    39   printf("%d
    ",ans);
    40 }
    View Code

    4027: [HEOI2015]兔子与樱花

    Time Limit: 10 Sec  Memory Limit: 256 MB
    Submit: 713  Solved: 410
    [Submit][Status][Discuss]

    Description

    很久很久之前,森林里住着一群兔子。有一天,兔子们突然决定要去看樱花。兔子们所在森林里的樱花树很特殊。樱花树由n个树枝分叉点组成,编号从0到n-1,这n个分叉点由n-1个树枝连接,我们可以把它看成一个有根树结构,其中0号节点是根节点。这个树的每个节点上都会有一些樱花,其中第i个节点有c_i朵樱花。樱花树的每一个节点都有最大的载重m,对于每一个节点i,它的儿子节点的个数和i节点上樱花个数之和不能超过m,即son(i) + c_i <= m,其中son(i)表示i的儿子的个数,如果i为叶子节点,则son(i) = 0

    现在兔子们觉得樱花树上节点太多,希望去掉一些节点。当一个节点被去掉之后,这个节点上的樱花和它的儿子节点都被连到删掉节点的父节点上。如果父节点也被删除,那么就会继续向上连接,直到第一个没有被删除的节点为止。
    现在兔子们希望计算在不违背最大载重的情况下,最多能删除多少节点。
    注意根节点不能被删除,被删除的节点不被计入载重。

    Input

    第一行输入两个正整数,n和m分别表示节点个数和最大载重

    第二行n个整数c_i,表示第i个节点上的樱花个数
    接下来n行,每行第一个数k_i表示这个节点的儿子个数,接下来k_i个整数表示这个节点儿子的编号

    Output

     一行一个整数,表示最多能删除多少节点。

    Sample Input

    10 4
    0 2 2 2 4 1 0 4 1 1
    3 6 2 3
    1 9
    1 8
    1 1
    0
    0
    2 7 4
    0
    1 5
    0

    Sample Output

    4

    HINT

    对于100%的数据,1 <= n <= 2000000, 1 <= m <= 100000, 0 <= c_i <= 1000


    数据保证初始时,每个节点樱花数与儿子节点个数之和大于0且不超过m
  • 相关阅读:
    Postgresql HStore 插件试用小结
    postgres-xl 安装与部署 【异常处理】ERROR: could not open file (null)/STDIN_***_0 for write, No such file or directory
    GPDB 5.x PSQL Quick Reference
    postgresql 数据库schema 复制
    hive 打印日志
    gp与 pg 查询进程
    jquery table 发送两次请求 解惑
    python 字符串拼接效率打脸帖
    postgresql 日期类型处理实践
    IBM Rational Rose软件下载以及全破解方法
  • 原文地址:https://www.cnblogs.com/wjyi/p/5596046.html
Copyright © 2011-2022 走看看