2023-07-14 Likou pregunta diaria

Enlace:

979. Asignar monedas en el árbol binario

Significado del título:

Un árbol binario con n nodos, la suma de los pesos de los nodos es n, cada vez que puede mover 1 peso entre los nodos adyacentes

Encuentra el número mínimo de veces que cada nodo es 1

desatar:

Dada una estructura de árbol, primero haga DFS/BFS, n no es grande, casualmente imprudente

En primer lugar, solo se debe dejar 1 para cada nodo, y se puede saber que si el nodo hoja no es 1, se debe mover a través del nodo principal.

Entonces, siempre que el nodo hoja esté preestablecido como 1 y el costo requerido se transfiera al nodo principal, el nodo hoja se puede borrar del árbol (porque se ha procesado)

Analiza las siguientes situaciones:

1. El valor del nodo hoja es 1: Dado que es un nodo hoja y el número es el correcto, la posibilidad de movimiento es 0, lo que significa que el nodo hoja ha sido procesado y se puede eliminar del árbol.

2. El valor del nodo de hoja es menor que 1: debido a que tiene una fuente única (nodo principal), puede realizar transferencias de costos, gastar primero 1 valor de tiempo de movimiento y, al mismo tiempo, reducir el valor del principal. nodo por 1-val, y luego se borra, porque ya no está involucrado en el movimiento (debido a que el nodo principal puede ser 0, habrá un número negativo después de la reducción, lo cual es fácil de entender, y se usa el peso en lugar de monedas de oro)

3. El valor del nodo hoja es mayor que 1: debido a que tiene un destino único (nodo principal), puede realizar una transferencia de costos, primero gastar val-1 veces de movimiento, dar todos los pesos redundantes al nodo principal, y luego se borra solo, porque ya no está involucrado en el móvil

4. Cuando todos los nodos de hoja se borran del árbol, sus nodos principales originales se denominan nuevos nodos de hoja y se procesan los tres casos anteriores.

5. Cuando solo quede el nodo raíz al final, ya que la suma de los pesos es n, se borrará cuando cada nodo sea 1, y el valor debe ser 1 cuando se procese el nodo raíz

Código real:

#include<bits/stdc++.h>
using namespace std;
struct TreeNode
{
    int val;
    TreeNode *left;
    TreeNode *right;
    TreeNode() : val(0), left(nullptr), right(nullptr) {}
    TreeNode(int x) : val(x), left(nullptr), right(nullptr) {}
    TreeNode(int x, TreeNode *left, TreeNode *right) : val(x), left(left), right(right) {}
};
void add(vector<int> &temp,TreeNode *root,int mao)//建树 
{
    root->val=temp[mao-1];
    if( mao*2-1<temp.size() && temp[mao*2-1]!=-1)//left child add 
    {
        root->left=new TreeNode;
        add(temp,root->left,mao*2);
    }
    
    if( mao*2<temp.size() && temp[mao*2]!=-1)//right child add 
    {
        root->right=new TreeNode;
        add(temp,root->right,mao*2+1);
    }
}
void solve(TreeNode* now,int &ans,TreeNode* father)
{
    if(now->left!=nullptr) solve(now->left,ans,now);//DFS
    
    if(now->right!=nullptr) solve(now->right,ans,now);//DFS
    
    //if(father==nullptr) return;
    //最后只剩根节点的时候,由于权值总和为n,当每个节点为1的时候才抹去,则处理到根节点时值一定为1
    //cout<<now->val<<" "<<ans<<endl;
    if(now->val<1 && father!=nullptr)
    {
        ans+= 1-now->val;//计算移动次数 
        father->val-= 1-now->val;//代价转移 
        now->val=1;//设为1
    }
    
    if(now->val>1 && father!=nullptr)
    {
        ans+= now->val-1;//计算移动次数 
        father->val+= now->val-1;//代价转移
        now->val=1;//设为1
    }
}
int distributeCoins(TreeNode* root)
{
    int ans=0;
    solve(root,ans,nullptr);
    return ans;
}
int main()
{
    int n;cin>>n;
    vector<int> temp;TreeNode root;
    for(int i=1;i<=n;i++)
    {
        int t;cin>>t;temp.push_back(t);
    }
    add(temp,&root,1);//建树 
    
    int ans=distributeCoins(&root);
    cout<<ans<<endl;
    return 0;
}

límite:

  • El número de nodos en el árbol esn
  • 1 <= n <= 100
  • 0 <= Node.val <= n
  • La suma de todos Node.vallos valores de esn

Supongo que te gusta

Origin blog.csdn.net/Fei_WuYan/article/details/131731392
Recomendado
Clasificación