North Lake Deep Hole | Ressentez le charme de l'algorithme

5. North Lake Deep Hole

Grades dix horaire d'ouverture Lundi 7 septembre 2020 09:00
remise 0,8 Temps de remise Mardi 15 septembre 2020 09:00
Soumission tardive autorisée non Heure de fermeture Samedi 10 octobre 2020 23:00

La description

Il y a dix ans, Beihu n'était qu'une fosse profonde et les travaux de stockage de l'eau n'étaient pas terminés. Afin d'assurer le bon déroulement du stockage de l'eau, nous devons faire une estimation approximative de la capacité de stockage de l'eau du lac Nord.

Afin de simplifier le calcul, nous supposons que le sol du lac Beihu est unidimensionnel, et que chaque pièce a une largeur de 1 et une hauteur d'un entier non négatif, puis un tableau peut être utilisé pour exprimer un morceau de sol.

Par exemple, le tableau [0 1 0 2 1 0 1 3 2 1 2 1] peut être utilisé pour représenter le sol dans la figure suivante:

La partie verte de l'image représente la partie au sol, la partie bleue représente la partie de stockage de l'eau et la capacité de stockage de l'eau est de 6.

Contribution

Il existe plusieurs groupes d'échantillons d'entrée.

Entrez l'entier T sur la première ligne pour indiquer qu'il existe T groupes de cas de test.

Ensuite, pour chaque ensemble de cas d'utilisation, entrez un entier positif n pour représenter la largeur du sol, puis n nombres pour représenter la hauteur du sol.

Production

Pour chaque cas d'utilisation, indiquez un nombre sur une ligne pour indiquer la quantité totale de stockage d'eau.

  Entrée de test Production attendue limite de temps Limite de mémoire Processus supplémentaire
Cas de test 1  
  1. 2↵
  2. 12↵
  3. 0 1 0 2 1 0 1 3 2 1 2 1↵
  4. 5↵
  5. 5 2 3 2 4↵
  1. 6↵
  2. 5↵
1 seconde 64 millions 0


Cette question est une question de réflexion, vous pouvez la résoudre si vous pensez à une méthode.

1. Analyse de la pensée

L'idée générale: analyser la capacité de stockage de chaque largeur, puis les additionner, ce qui correspond à la capacité de stockage totale dont nous avons besoin.

Le point est donc ici, comment obtenir la capacité de stockage de chaque largeur?

Grâce à l'observation, nous pouvons voir que pour une certaine quantité d'eau à partir de sa position finale une valeur plus petite en haut à gauche et à droite de la décision (où les côtés gauche et droit, et il n'y a pas nécessairement le Kazakhstan voisin, aussi longtemps que la gauche, sur la droite pouvez)

Par exemple, dans l'image ci-dessus: le volume d'eau en position 4 est déterminé par les nombres 1 et 11, et le volume d'eau en position 8 est déterminé par les nombres 7 et 11 ...


2. Conception d'algorithmes

       L'idée est sortie, la partie suivante est d'écrire l'algorithme. Nous devons d'abord calculer deux tableaux: gauche et droit. Parmi eux, gauche [i] représente la valeur de point la plus élevée à 0 ~ i, c'est-à-dire le point le plus élevé sur le côté gauche de i; droite [i] représente la valeur de point la plus élevée à i ~ n-1, c'est-à-dire le point le plus élevé sur le côté droit de i.

       Ensuite, la capacité de stockage de l'eau à chaque emplacement peut être exprimée comme suit: min (gauche [i], droite [i]) - a [i]

Enfin, faites attention à:

  1. Nous définissons que les tableaux de gauche, de droite et de h sont en dehors de la fonction principale, c'est-à-dire définis comme des variables globales . Étant donné que la mémoire de la pile dans la fonction principale est inférieure à la mémoire globale, si certaines applications de mémoire volumineuses sont définies dans la fonction principale, il est facile de mettre en rafale la pile, c'est-à-dire la mémoire en rafale. Lorsque vous le soumettez, tle apparaîtra (en fait, il devrait être mle essentiellement). 
  2. Étant donné que chaque ensemble de cas de test est entré dans une boucle, vous devez penser à les réinitialiser dans la boucle, sinon le calcul se poursuivra sur la base de la boucle précédente à chaque fois.

Aller au code ~ 

#include<stdio.h>

long long int left[100000] = {0}, right[100000] = {0}, h[100000] = {0};

int main() {
    int n, T;
    for (scanf("%d", &T); T; T--) {

        scanf("%d", &n);
        for (int i = 0; i < n; i++)
            scanf("%lld", &h[i]);

        /* 分别计算left和right数组 */
        
        left[0] = h[0];  //边缘情况单独考虑
        right[n - 1] = h[n - 1];   //边缘情况单独考虑

        for (int i = 1; i < n - 1; i++)
            if (h[i] < left[i - 1])
                left[i] = left[i - 1];
            else
                left[i] = h[i];
        for (int i = n - 2; i > 0; i--)
            if (h[i] < right[i + 1])
                right[i] = right[i + 1];
            else
                right[i] = h[i];
            
        //计算总的储水量
        long long int total = 0;  //一定记得赋初值0,不然下一组求值的时候会在上一组答案的基础上加
        for (int i = 1; i < n - 1; i++)
            if (left[i] > right[i])
                total += right[i] - h[i];
            else
                total += left[i] - h[i];

        printf("%lld\n", total);
    }
}


Bienvenue à faire attention au compte public personnel "  Chicken Wing Programming" , voici un agriculteur de code sérieux et bien élevé.

---- Soyez le blogueur le plus sage et le programmeur le plus solide ----

Essayez d'écrire chaque article avec soin et résumez généralement les notes en mises à jour push ~

Insérez la description de l'image ici

 

Je suppose que tu aimes

Origine blog.csdn.net/weixin_43787043/article/details/108456824
conseillé
Classement