HDU5122

HDU5122

1. Lien thématique

Lien thématique

Deuxièmement, le sujet

Nervending est un ACMer.
Hier, NE a appris un algorithme: le tri à bulles. Le tri à bulles comparera chaque paire d'éléments adjacents et les échangera s'ils sont dans le mauvais ordre. Le processus se répète jusqu'à ce qu'aucun échange ne soit nécessaire.
Aujourd'hui, NE propose un nouvel algorithme et le nomme Strange Sorting.
Il y a beaucoup de tours dans le tri étrange. Pour chaque tour, NE choisit un nombre et continue de l'échanger avec son numéro suivant tandis que le nombre suivant est inférieur à lui. Par exemple, si la séquence est «1 4 3 2 5» et que NE choisit «4», il obtiendra «1 3 2 4 5» après ce tour. Le tri étrange est similaire au tri à bulles, mais c'est un algorithme aléatoire car NE choisira un nombre aléatoire au début de chaque tour. NE veut savoir que, pour une séquence donnée, combien de tours sont nécessaires pour trier cette séquence dans la meilleure situation. En d'autres termes, vous devez répondre au nombre minimal de tours nécessaires pour trier la séquence par ordre croissant. Pour simplifier le problème, NE promet que la séquence est une permutation de 1, 2,. . . , N.

Traduction:

Nervending est un ACMer.
Hier, NE a appris un algorithme: le tri à bulles. Le tri à bulles comparera chaque paire d'articles adjacents et les échangera si l'ordre est incorrect. Répétez le processus jusqu'à ce qu'aucun échange ne soit nécessaire.
Aujourd'hui, NE a proposé un nouvel algorithme et l'a nommé "Tri étrange".
Il y a beaucoup de tours dans un tri étrange. Pour chaque tour, NE choisira un nombre et continuera à l'échanger avec le numéro suivant lorsque le nombre suivant est inférieur à ce nombre. Par exemple, si la séquence est "1 4 3 2 5" et que NE choisit "4", il obtiendra "1 3 2 4 5" après ce tour. Le tri étrange est similaire au tri à bulles, mais il s'agit d'un algorithme aléatoire car l'élément de réseau choisit un nombre aléatoire au début de chaque tour. NE a besoin de savoir, pour une séquence donnée, combien de tours sont nécessaires pour trier la séquence dans le meilleur des cas. En d'autres termes, vous devez répondre au nombre minimum de tours requis pour trier la séquence par ordre croissant. Afin de simplifier le problème, la séquence d'engagement NE est une séquence de 1, 2, .... . . , N.

Contribution

La première ligne ne contient qu'un seul entier T (T ≤ 200), qui indique le nombre de cas de test. Pour chaque cas de test, la première ligne contient un entier N (1 ≤ N ≤ 10 6 ).
La deuxième ligne contient N entiers ai (1 ≤ ai ≤ N), indiquant la séquence que NE vous donne.
La somme de N dans tous les cas de test ne dépasserait pas 3 × 10 6 .

Production

Pour chaque cas de test, affichez une seule ligne «Cas #x: y», où x est le numéro de cas (à partir de 1), y est le nombre minimal de tours nécessaires pour trier la séquence.

Exemple d'entrée

2
5
5 4 3 2 1
5
5 1 2 3 4

Exemple de sortie

Cas n ° 1: 4
Cas n ° 2: 1

Troisièmement, la question est démontée

  • Tout d'abord, nous savons que ce que nous devons faire est de calculer le tour minimum d'un tri, puis regardons le contenu grossièrement donné du titre:

Pour chaque tour, NE choisira un nombre et continuera à l'échanger avec le numéro suivant lorsque le nombre suivant est inférieur à ce nombre. Par exemple, si la séquence est "1 4 3 2 5" et que NE choisit "4", il obtiendra "1 3 2 4 5" après ce tour.

  • Qu'est-ce que ça veut dire? Lorsque nous choisissons un nombre, ce nombre sera toujours échangé avec un nombre plus petit que lui dans ce tour, de sorte que le nombre dans ce tour garantisse que le nombre derrière lui est plus grand que lui.
  • Une chose à noter ici est justeLe nombre derrièrePlus gros que ça, pas tous les chiffres derrière.
  • c'est bon! Nous abordons ensuite les sujets suivants:

Le tri étrange est similaire au tri à bulles, mais il s'agit d'un algorithme aléatoire car l'élément de réseau choisit un nombre aléatoire au début de chaque tour. NE a besoin de savoir, pour une séquence donnée, combien de tours sont nécessaires pour trier la séquence dans le meilleur des cas. En d'autres termes, vous devez répondre au nombre minimum de tours requis pour trier la séquence par ordre croissant.

  • La signification du titre ici est évidente. Nous devons trouver un moyen de sélectionner les nombres pour que cela devienne une séquence ascendante avec le plus petit tour.
  • plage de données

T ≤ 200
1 ≤ N ≤ 10 6
Somme des données <= 3 × 10 6

Quatre idées de résolution de problèmes

  • Maintenant, essayons d'analyser la logique de travail du "genre étrange" dans le titre:
  1. Choisissez un nombre au hasard
  2. Faites-le "couler" jusqu'à ce que vous rencontriez un nombre plus grand que lui.
  3. Répétez les étapes 1-2 jusqu'à ce que la séquence devienne une séquence ascendante.
  • Alors, comment pouvons-nous minimiser ce cycle?
    C’est très simple. Nous sélectionnons le plus grand élément du tableau à chaque tour, de sorte que même le plus rond ne représente que n fois
  • Alors, comment calculer ce tour minimum?
    Premièrement, nous devons déterminer quels nombres du tableau doivent «couler», et trouver le nombre de ces nombres, qui est le nombre minimum de tours dont nous avons besoin. Alors, comment devrions-nous trouver le nombre de ces nombres?
  • Quelle est la raison pour laquelle un nombre doit «couler» dans le tableau? C'est qu'il y a des nombres "plus légers" en dessous, donc nous avons seulement besoin de voir quels nombres ont des nombres "plus légers" en dessous.
    Idées spécifiques
  • Passez du dernier chiffre du tableau à la tête du tableau, enregistrez le plus petit nombre à la position actuelle du tableau, et lorsque le nombre actuel est supérieur au plus petit nombre, laissez le tour +1.
  • Par exemple:
    5 4 3 1 2
    Nous définissons une somme arrondie, qui est initialisée à 0. Définissez le nombre minimum actuel min d'un tableau de sorte qu'il soit égal au dernier chiffre du tableau, puis parcourez d'avant en arrière à partir du de l'avant-dernier chiffre du tableau.
  • i = 1, scan à 1, min = 2 <1, mise à jour min, à ce moment min = 1, somme = 0
  • i = 2, scan à 3, min = 1> 3, le nombre doit couler, sum ++, min ne change pas, le tri du tableau est 5 4 1 2 3
  • i = 3, scan à 4, min = 1> 4, nombre de puits, somme ++
  • i = 4, scan à 5, min> 5, nombre de puits, somme ++
  • Somme des résultats de sortie = 3

Cinq, le code

#include "iostream"
using namespace std;
int main()
{
    
    
    int n;
    scanf("%d",&n);//输入样例数
    for(int i=1;i<=n;i++)
    {
    
    
        int t;//数组大小
        scanf("%d",&t);
        int a[t+5];
        for(int g=0;g<t;g++)
        {
    
    
            scanf("%d",&a[g]);//用scanf可以防止数据过多超时
        }
        int sum=0;//定义轮次
        int mnum=a[t-1];//定义当前最小数字,使其等于数组末尾数字
        for(int g=t-2;g>=0;g--)
        {
    
    
            if(a[g]>mnum)//如果当前数字大于最小数字,说明数字需要下沉
            {
    
    
                sum++;
            } else//如果不需要下沉,更新最小数
            {
    
    
                mnum=a[g];
            }
        }
        printf("Case #%d: %d\n",i,sum);
    }
}

  • Le point à noter est que vous n'utilisez pas cin pour vous connecter en même temps

ios :: sync_with_stdio (false);

  • S'il expire, il est recommandé d'utiliser scanf pour saisir les données.

Je suppose que tu aimes

Origine blog.csdn.net/Verber/article/details/112907593
conseillé
Classement