zoukankan      html  css  js  c++  java
  • 二分法 organ Saltless

    organ

    【描述】

    现在某组织中(记作R)有n个人,他们的联络网形成一棵以Saltless为根的树,有边相连代表两人可以直接联络。
    每个人有一个代号,Saltless代号为1,且除Saltless外每个人的父节点的代号小于他自己的代号。
    由于某些原因,Saltless给R的成员分别下达紧急任务,R需要分成m组行动,每个组必须满足如下条件:
        1、每个组员仅分在本组中
        2、至少有一个组员
        3、任意两个组员无需通过本组外的人就可以联络(但可以通过本组组员进行联络)
     
    每个人有一个能力指数,一个组的能力指数是全组人能力指数之和。
    对于任意一种正确的分组,平均度就是m组中最小能力指数。为了分组较为平均,Saltless希望平均度尽可能大。
     
    【格式】
    PROGRAM NAME: organ
     
    INPUT FORMAT:
    第一行为三个数:n,m,和Saltless的能力指数(1<=m<=n<=10000)。
    接下来n-1行,每行两个数:此人的父节点代号和他的能力指数(能力指数值为正整数,不超过30,行数就是他本身的代号)
     
    OUTPUT FORMAT:
    输出格式: 一个数,表示最大的平均度。
     
    SAMPLE INPUT (organ.in)
    7 2 2
    1 4
    1 5
    2 1
    2 2
    3 4
    4 3
     
    SAMPLE OUTPUT (organ.out)
    10
     
     
    【Hint】
    分组:{1,3,6},{2,4,5,7}

     

     1 /*这道题目的关键就在于子节点的编号一定小于它的父亲编号,那么我们倒叙循环就可以按照题目要求(从子到父)遍历所有点。
     2 二分一个最小值,如果i这个节点的子树上(一定可以相互联系)的总和小于x,那么就把这些值加到i的父亲上,else 就分组数目+1,
     3 检验如果最后的分组数多于等于m,就是最小值取小了,l=mid+1,else r=mid+1,貌似最后输出l还是r,因为题目而有所不同,我区分不开,都是用样例检验
     4 */
     5 #define N 10011
     6 #include<iostream>
     7 using namespace std;
     8 #include<cstdio>
     9 #include<cstring>
    10 int p[N],fa[N],abi[N],n,m,l=0,r=0;
    11 inline void input()
    12 {
    13     scanf("%d%d%d",&n,&m,&abi[1]);
    14     for(int i=2;i<=n;++i)
    15     {
    16         scanf("%d%d",&fa[i],&abi[i]);
    17         r+=abi[i];
    18     }
    19 }
    20 bool check(int x)
    21 {
    22     for(int i=1;i<=n;++i)
    23       p[i]=abi[i];
    24     int num=0;
    25     for(int i=n;i>=1;--i)
    26       if(p[i]<x) p[fa[i]]+=p[i];
    27       else num++;
    28     return (num>=m);/*当数目刚好取到的时候,我们也要取大,因为题目要最小值的最大*/
    29 }
    30 int main()
    31 {
    32     input();
    33     int mid;
    34     while(l<=r)
    35     {
    36         mid=(l+r)>>1;
    37         if(check(mid))
    38           l=mid+1;
    39         else r=mid-1;
    40     }
    41     printf("%d
    ",r);
    42     return 0;
    43 }

     

  • 相关阅读:
    poj 3322 不错的搜索题,想通了就很简单的。
    spoj 10649 镜子数的统计(正过来反过去一样)
    搜索第一题(poj 1190)蛋糕
    HashMap和Hashtable的区别
    ajax简单联动查询以及遇到的问题
    PHP之面向对象
    pg_bulkload快速加载数据
    WalMiner
    postgresWAL写放大优化
    postgresql创建统计信息优化
  • 原文地址:https://www.cnblogs.com/c1299401227/p/5585564.html
Copyright © 2011-2022 走看看