[PAT Clase A Otoño 2020] 7-1 Panda y PP Milk (20 puntos)

panda.jpg

La leche PP (盆 盆 奶) es la favorita de Pandas. Se alinearían para disfrutarlo como se muestra en la imagen. Por otro lado, podrían beber en paz solo si creen que la cantidad de leche PP está distribuida de manera justa, es decir, el panda más gordo puede tener más leche y los que tienen el mismo peso pueden tener la misma cantidad. Como están alineados, cada panda solo puede compararse con su vecino (s), y si cree que esto es injusto, el panda pelearía con su vecino.

Dado que la cantidad mínima de leche que debe beber un panda es de 200 ml. Solo cuando otro tazón de leche es al menos 100 ml más que el suyo, un panda puede sentir la diferencia.

Ahora, dados los pesos de una línea de pandas, su trabajo es ayudar al criador (饲养员) a decidir la cantidad mínima total de leche que debe preparar, siempre que los pandas estén alineados en el orden dado.

Especificación de entrada:

Cada archivo de entrada contiene un caso de prueba. Para cada caso, primero se da un número entero positivo n (≤10 4) como el número de pandas. Luego, en la siguiente línea, se dan n números enteros positivos como los pesos (en kg) de los pandas, cada uno no más de 200. Los números están separados por espacios.

Especificación de salida:

Para cada caso de prueba, imprima en una línea la cantidad mínima total de leche que debe preparar el criador, para asegurarse de que todos los pandas puedan beber en paz.

Entrada de muestra:

10
180 160 100 150 145 142 138 138 138 140

Salida de muestra:

3000

Pista:

La distribución de la leche es la siguiente:

400 300 200 500 400 300 200 200 200 300

Código:

#include<bits/stdc++.h>
using namespace std;
int main(){
    int n,milk,sum=0;
    cin>>n;
    vector<int> v(n),l(n),r(n),ans(n);
    for(int i=0;i<n;i++)
        cin>>v[i];
    //从左→右遍历
    l[0]=200;
    milk=200;
    for(int i=1;i<n;i++)
        if(v[i]>v[i-1]){
            milk+=100;
            l[i]=milk;
        }else if(v[i]==v[i-1])
            l[i]=l[i-1];
        else{
            milk=200;
            l[i]=milk;
        }
    r[n-1]=200;
    milk=200;
    //从右→左遍历
    for(int i=n-2;i>=0;i--)
        if(v[i]>v[i+1]){
            milk+=100;
            r[i]=milk;
        }else if(v[i]==v[i+1])
            r[i]=r[i+1];
        else{
            milk=200;
            r[i]=milk;
        }
      for(int i=0;i<n;i++){
          ans[i]=(l[i]>=r[i])?l[i]:r[i];
          sum+=ans[i];
      }
    printf("%d",sum);
    return 0;
}

Al principio no tenía idea sobre esta pregunta, pero después de ver este método, sentí que era realmente inteligente ~

Supongo que te gusta

Origin blog.csdn.net/WKX_5/article/details/114704773
Recomendado
Clasificación