Árbol DP (Búsqueda memorizada) PAT Clase A 1079 1090 1106

Tree dp: se usa para encontrar la distancia desde cualquier nodo en el árbol hasta el nodo raíz

plantilla:

int dfs(int i){
    if(f[i] != -1) return f[i];
    if(p[i] == -1) return f[i] = 0;
    return f[i] = dfs(p[i]) + 1;
}

Enlace del título original:

1079 Ventas totales de la cadena de suministro

Precio máximo de la cadena de suministro 1090

1106 El precio más bajo en la cadena de suministro

tema:

Ventas totales de la cadena de suministro

Una cadena de suministro es una red de ventas de minoristas, distribuidores y proveedores, cada uno de los cuales está involucrado en el proceso de trasladar los productos de los proveedores a los clientes.

Toda la red de ventas se puede considerar como una estructura de árbol Desde el proveedor raíz hacia abajo, después de que todos compran bienes del proveedor de nivel superior, suponiendo que el precio de compra es P, comprarán a un precio r% más alto que el precio de compra. El precio se vende a la baja.

Solo los minoristas (es decir, los nodos hoja) pueden vender productos directamente a los clientes.

Ahora, dada la red de ventas completa, calcule las ventas totales de todos los minoristas.

La primera línea del formato de entrada
contiene tres números, N representa el número total de miembros en la cadena de suministro (todos los miembros están numerados de 0 a N−1, y el número del proveedor raíz es 0), P representa el precio de venta de cada producto del proveedor raíz, r , el porcentaje de prima.

Siguientes N líneas, cada línea contiene la información de un miembro, el formato es el siguiente:

Ki ID[1] ID[2] ... ID[Ki]
En la i-ésima línea, Ki representa el número de miembros que compran directamente bienes del proveedor i, y los siguientes enteros Ki son el número de cada miembro de compra.

Si el Kj de una determinada fila es 0, significa que se trata de un minorista, entonces solo irá seguido de un número, que indica la cantidad total de productos vendidos a los clientes.

Formato de salida
Muestra las ventas totales, conserva un decimal.

Rango de datos
1≤N≤105,
0<P≤1000,
0<r≤50
Cada minorista no tiene más de 100 productos.
Se garantiza que la respuesta final no exceda 1010.

Ejemplo de entrada:
10 1,80 1,00
3 2 3 5 1
9
1 4
1 7
0 7
2 6 1
1 8
0 9
0 4
0 3
Ejemplo de salida:
42,4

Mi solución:

#include <bits/stdc++.h>
using namespace std;

const int N = 100010;
double R, P;
int p[N], f[N], cnt[N];

int dfs(int i){
    if(f[i] != -1) return f[i];
    if(p[i] == -1) return f[i] = 0;
    return f[i] = dfs(p[i]) + 1;
}
int main(){
    int n;
    cin >> n >> P >> R;
    memset(f, -1, sizeof f);
    memset(p, -1, sizeof p);
    for(int i = 0; i < n; i ++ ){
        int k;
        cin >> k;
        for(int j = 0; j < k; j ++ ){
            int son;
            cin >> son;
            p[son] = i;
        }
        
        if(k == 0) cin >> cnt[i];
    }
    
    double res = 0;
    for(int i = 0; i < n; i ++ ){
        if(cnt[i]){
            res += cnt[i] * P * pow(1 + R/100, dfs(i));
        }
    }
    
    printf("%.1lf", res);
    return 0;
}

El precio más alto en la cadena de suministro

Una cadena de suministro es una red de ventas de minoristas, distribuidores y proveedores, cada uno de los cuales está involucrado en el proceso de trasladar los productos de los proveedores a los clientes.

Toda la red de ventas se puede considerar como una estructura de árbol Desde el proveedor raíz hacia abajo, después de que todos compran bienes del proveedor de nivel superior, suponiendo que el precio de compra es P, comprarán a un precio r% más alto que el precio de compra. El precio se vende a la baja.

Solo los minoristas (es decir, los nodos hoja) pueden vender productos directamente a los clientes.

Ahora, dada la red de ventas completa, calcule el precio de venta más alto que el minorista puede lograr.

Formato de entrada
La primera línea contiene tres números, N representa el número total de miembros en la cadena de suministro (todos los miembros están numerados de 0 a N−1); P representa el precio de venta del producto del proveedor raíz; r representa el porcentaje de prima.

La segunda fila contiene N números, y el i-ésimo número Si es el número del proveedor de nivel superior del miembro número i. El proveedor raíz tiene un Sroot de -1.

Formato de salida
Muestra el precio de venta más alto que un minorista puede lograr, redondeado a dos decimales, y el número de minoristas que pueden lograr el precio de venta más alto.

El rango de datos es
1≤N≤105,
0<P≤1000,
0<r≤50, y
se garantiza que la respuesta final no exceda 1010.

Ejemplo de entrada:
9 1,80 1,00
1 5 4 4 -1 4 5 3 6
Ejemplo de salida:
1,85 2

Mi solución:

#include <bits/stdc++.h>
using namespace std;

const int N = 100010;
int n;
double P, R;
int p[N], f[N];

int dfs(int i){
    if(f[i] != -1) return f[i];
    if(p[i] == -1) return f[i] = 0;
    return f[i] = dfs(p[i]) + 1;
}

int main(){
    cin >> n >> P >> R;
    
    memset(p, -1, sizeof p);
    for(int i = 0; i < n; i ++ ){
        int father;
        cin >> father;
        p[i] = father;
    }
    
    memset(f, -1, sizeof f);
    
    int cnt = 0, res = 0;
    for(int i = 0; i < n; i ++ ){
        if(dfs(i) > res){
            res = dfs(i);
            cnt = 1;
        }
        else if(dfs(i) == res) cnt ++;
    }
    
    printf("%.2lf %d", P * pow(1 + R / 100, res), cnt);
    return 0;
}

El precio más bajo en la cadena de suministro

Una cadena de suministro es una red de ventas de minoristas, distribuidores y proveedores, cada uno de los cuales está involucrado en el proceso de trasladar los productos de los proveedores a los clientes.

Toda la red de ventas se puede considerar como una estructura de árbol Desde el proveedor raíz hacia abajo, después de que todos compran bienes del proveedor de nivel superior, suponiendo que el precio de compra es P, comprarán a un precio r% más alto que el precio de compra. El precio se vende a la baja.

Solo los minoristas (es decir, los nodos hoja) pueden vender productos directamente a los clientes.

Ahora, dada la red de ventas completa, calcule el precio de venta mínimo que el minorista puede lograr.

La primera línea del formato de entrada
contiene tres números, N representa el número total de miembros en la cadena de suministro (todos los miembros están numerados de 0 a N−1, y el número del proveedor raíz es 0), P representa el precio de venta del producto de el proveedor raíz, r, el porcentaje de prima.

Siguientes N líneas, cada línea contiene la información de un miembro, el formato es el siguiente:

Ki ID[1] ID[2] ... ID[Ki]
En la i-ésima línea, Ki representa el número de miembros que compran directamente bienes del proveedor i, y los siguientes enteros Ki son el número de cada miembro de compra.

Si Kj es 0, significa que el j-ésimo miembro es un minorista.

Formato de salida
Muestra el precio de venta más bajo que un minorista puede lograr, redondeado a cuatro decimales, y el número de minoristas que pueden lograr el precio de venta más bajo.

Rango de datos
1≤N≤105,
0<P≤1000,
0<r≤50,
se garantiza que la respuesta final no exceda 1010
Muestras de entrada:
10 1,80 1,00
3 2 3 5
1 9
1 4 1
7
0
2 6 1
1 8
0
0
0
muestra de salida:
1.8362 2

Mi solución:

#include <bits/stdc++.h>
using namespace std;
const int N = 100010, INF = 1e9;
int n;
double P, R;
int p[N], f[N];
bool is_leaf[N];

int dfs(int i){
    if(f[i] != -1) return f[i];
    if(p[i] == -1) return f[i] = 0;
    return f[i] = dfs(p[i]) + 1;
}

int main(){
    cin.tie();
    cin >> n >> P >> R;
    memset(p, -1, sizeof p);

    for(int i = 0; i < n; i ++ ){
        int k;
        cin >> k;
        for(int j = 0; j < k; j ++ ){
            int son;
            cin >> son;
            p[son] = i;
        }
        if(k == 0) is_leaf[i] = true;
    }
    

    memset(f, -1, sizeof f);
    int res = INF, cnt = 0;
    for(int i = 0; i < n; i ++ ){
        if(is_leaf[i]){
            if(dfs(i) < res){
                res = dfs(i);
                cnt = 1;
            }
            else if(dfs(i) == res) cnt ++ ;
        }
    }
    
    printf("%.4lf %d", P * pow(1 + R / 100, res), cnt);
    return 0;
}

Supongo que te gusta

Origin blog.csdn.net/weixin_45660485/article/details/126082343
Recomendado
Clasificación