2 条题解

  • 3
    @ 2021-8-7 18:41:43

    C++ :

    #include <iostream>
    #include <algorithm>
    
    using namespace std;
    
    const int N = 1010;
    
    struct Node
    {
        int father, size, sum;
        double avg;
    }nodes[N];
    
    int n, root;
    
    int find() //找权值最大的根节点
    {
        double avg = 0;
        int res = -1;
        for(int i = 1; i <=n; i++)
            if(i != root && avg < nodes[i].avg)
            {
                avg = nodes[i].avg;
                res = i;
            }
        return res;    
    }
    
    int main()
    {
        int res = 0;
        cin >> n >> root;
        for(int i = 1; i <= n; i++)
        {
            auto &nd = nodes[i];
            cin >> nd.sum;
            nd.size = 1;
            nd.avg = nd.sum;
            res += nd.sum; //初始赋值 每个数乘一加一块,所有数的和
        }
        for(int i = 0, a, b; i < n - 1;i++)
        {
            cin >> a >> b;
            nodes[b].father = a;
        }
        
        for(int i = 0; i < n - 1; i++)
        {
            int ver = find();
            int f = nodes[ver].father;
            res += nodes[ver].sum * nodes[f].size;
            nodes[ver].avg = -1;
            for(int j = 1; j <= n; j++)
                if(nodes[j].father == ver)
                    nodes[j].father = f;
            nodes[f].sum += nodes[ver].sum;
            nodes[f].size += nodes[ver].size;
            nodes[f].avg = (double)nodes[f].sum / nodes[f].size;
        }
        cout << res << endl;
        return 0;
    }
    
    
    • 0
      @ 2025-3-30 10:31:10

      #include #include

      using namespace std;

      const int N = 1010;

      struct Node { int father, size, sum; double avg; }nodes[N];

      int n, root;

      int find() //找权值最大的根节点 { double avg = 0; int res = -1; for(int i = 1; i <=n; i++) if(i != root && avg < nodes[i].avg) { avg = nodes[i].avg; res = i; } return res;
      }

      int main() { int res = 0; cin >> n >> root; for(int i = 1; i <= n; i++) { auto &nd = nodes[i]; cin >> nd.sum; nd.size = 1; nd.avg = nd.sum; res += nd.sum; //初始赋值 每个数乘一加一块,所有数的和 } for(int i = 0, a, b; i < n - 1;i++) { cin >> a >> b; nodes[b].father = a; }

      for(int i = 0; i < n - 1; i++)
      {
          int ver = find();
          int f = nodes[ver].father;
          res += nodes[ver].sum * nodes[f].size;
          nodes[ver].avg = -1;
          for(int j = 1; j <= n; j++)
              if(nodes[j].father == ver)
                  nodes[j].father = f;
          nodes[f].sum += nodes[ver].sum;
          nodes[f].size += nodes[ver].size;
          nodes[f].avg = (double)nodes[f].sum / nodes[f].size;
      }
      cout << res << endl;
      return 0;
      

      }

      • 1

      信息

      ID
      26
      时间
      1000ms
      内存
      128MiB
      难度
      1
      标签
      递交数
      95
      已通过
      81
      上传者