C++ : comment résoudre ce problème ? J’ai presque réussi, je suis juste resté un peu coincé

la programmation


J’étais en train de résoudre des problèmes de C++ jusqu’à ce que je rencontre celui-ci, que je ne pouvais tout simplement pas AC après un long moment (je ne pouvais même pas passer un échantillon). S’il vous plaît, aidez-moi !

Le fermier John a une tâche importante : déterminer quel type de foin acheter pour ses vaches.
Les Nvaches du fermier John (2≤N≤10^5) sont numérotées de 1 à Net chaque vache aime exactement un type de foin h(i) : (1≤h(i)≤N. Il veut que toutes ses vaches aiment le même type de foin.
Pour y parvenir, Farmer John peut organiser des groupes de discussion. Un groupe de discussion consiste à rassembler toutes les vaches d’une zone contiguë numérotée ito j inclusivement pour une réunion. S’il existe un type de foin que plus de la moitié des vaches du groupe aiment, une fois la réunion du groupe de discussion terminée, toutes les vaches finissent par aimer ce type de foin. Si ce type de foin n’existe pas, alors aucune vache ne change le type de foin qu’elle aime. Par exemple, dans un groupe de discussion composé d’un groupe de 16 vaches, 9 d’entre elles ou plus devraient avoir la même préférence en matière de foin pour que les vaches restantes changent de préférence en conséquence.
Le fermier John veut savoir quels types de foin peuvent être appréciés simultanément par toutes les vaches. Il ne peut animer qu’un seul groupe de discussion à la fois, mais il peut animer autant de groupes de discussion que nécessaire pour que toutes les vaches aiment le même type de foin.

FORMAT D’ENTRÉE :
Le premier sera constitué d’un entier T, désignant le nombre de cas de tests indépendants (1≤T≤10)

La première ligne de chaque scénario de test est constituée de N.
La deuxième ligne est constituée de N entiers, les types de foin h(i) préférés des vaches dans l’ordre.
Il est garanti que la somme de N sur tous les cas de test ne dépasse pas 2⋅10^5.

FORMAT DE SORTIE:
Lignes T de sortie, une ligne par scénario de test.
S’il est possible de faire en sorte que toutes les vaches aiment simultanément le même type de foin, produisez tous les types de foin possibles dans un ordre croissant. Sinon, affichez −1. Lorsque vous imprimez une liste de nombres sur la même ligne, séparez les nombres adjacents par un espace et assurez-vous que la ligne ne se termine pas par des espaces superflus.

EXEMPLE D’ENTRÉE :
5
5
1 2 2 2 3
6
1 2 3 1 2 3
6
1 1 1 2 2 2
3
3 2 3
2
2 1
EXEMPLE DE SORTIE :
2
-1
1 2
3
-1
Dans l’exemple d’entrée, il y a 5 cas de test.
Dans le premier cas de test, il est uniquement possible de rendre toutes les vaches semblables au type 2. FJ peut le faire en organisant un seul groupe de discussion avec toutes les vaches.
Dans le deuxième cas test, nous pouvons montrer qu’aucune vache ne changera le type de foin qu’elle aime.
Dans le troisième cas de test, il est possible de rendre toutes les vaches semblables au type 1 en organisant trois groupes de discussion – d’abord en ayant les vaches 1 à 4 dans un groupe de discussion, puis en ayant les vaches 1 à 5 dans un groupe de discussion, puis en ayant des vaches 1 à 6 dans un groupe de discussion. Par une logique similaire, en utilisant les vaches 3 à 6, les vaches 2 à 6, puis les vaches 1 à 6, nous pouvons faire en sorte que toutes les vaches ressemblent au type 2.
Dans le quatrième cas de test, il est possible de rendre toutes les vaches du type 3 en organisant un seul groupe de discussion avec toutes les vaches.
Dans le cinquième cas test, nous pouvons montrer qu’aucune vache ne changera le type de foin qu’elle aime.

NOTATION :

* Entrée 2 : N=2.
* Entrées 3-4 : N≤50.
* Entrées 5-6 : h(i)≤h(i+1) pour tout 1≤i≤N−1.
* Entrées 7-15 : Aucune contrainte supplémentaire.

Ce que j’ai essayé :

J’ai élaboré le code suivant (qui donne même des erreurs dans la dernière ligne de sortie de l’exemple d’E/S) :

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

int main() {
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);

    int T;
    cin >> T;
    while(T--) {
        int N;
        cin >> N;
        vector<int> h(N);
        for(int i=0; i<N; i++) {
            cin >> h[i];
        }

        map<int, int> count;
        for(int i=0; i<N; i++) {
            count[h[i]]++;
        }

        vector<int> possible;
        for(auto &p : count) {
            if(p.second > N/2) {
                possible.push_back(p.first);
            }
        }

        if(possible.empty()) {
            // Check for types of hay liked by exactly half the cows
            for(auto &p : count) {
                if(p.second == N/2) {
                    possible.push_back(p.first);
                }
            }
        }

        if(possible.empty()) {
            cout << -1 << "\n";
        } else {
            sort(possible.begin(), possible.end());
            for(int i=0; i<possible.size(); i++) {
                cout << possible[i] << (i == possible.size()-1 ? "\n" : " ");
            }
        }
    }

    return 0;
}

Si quelqu’un a des solutions ou des modifications au code qui peuvent répondre à la question, dites-le-moi ! Merci beaucoup à vous tous!

Solution 1

Compiler ne signifie pas que votre code est correct ! :rire:
Considérez le processus de développement comme la rédaction d’un e-mail : une compilation réussie signifie que vous avez écrit l’e-mail dans la bonne langue – l’anglais plutôt que l’allemand par exemple – et non que l’e-mail contenait le message que vous vouliez envoyer.

Vous entrez maintenant dans la deuxième étape du développement (en réalité, c’est la quatrième ou la cinquième, mais vous reviendrez aux étapes précédentes plus tard) : les tests et le débogage.

Commencez par regarder ce qu’il fait et en quoi cela diffère de ce que vous vouliez. Ceci est important, car cela vous donne des informations sur la raison pour laquelle il le fait. Par exemple, si un programme est destiné à permettre à l’utilisateur de saisir un nombre et qu’il le double et imprime la réponse, alors si l’entrée/sortie était comme ceci :

Input   Expected output    Actual output
  1            2                 1
  2            4                 4
  3            6                 9
  4            8                16

Ensuite, il est assez évident que le problème vient du bit qui le double – il ne s’ajoute pas à lui-même, ni ne le multiplie par 2, il le multiplie par lui-même et renvoie le carré de l’entrée.
Donc avec ça, vous pouvez regarder le code et il est évident qu’il se trouve quelque part ici :

C++
int Double(int value)
   {
   return value * value;
   }

Une fois que vous avez une idée de ce qui pourrait ne pas fonctionner, commencez à utiliser le débogueur pour découvrir pourquoi. Placez un point d’arrêt sur la première ligne de la méthode et exécutez votre application. Lorsqu’il atteint le point d’arrêt, le débogueur s’arrêtera et vous confiera le contrôle. Vous pouvez maintenant exécuter votre code ligne par ligne (appelé “single stepping”) et consulter (ou même modifier) ​​le contenu des variables si nécessaire (bon sang, vous pouvez même modifier le code et réessayer si vous en avez besoin).
Pensez à ce que chaque ligne du code doit faire avant de l’exécuter et comparez cela à ce qu’elle a réellement fait lorsque vous utilisez le bouton « Passer par-dessus » pour exécuter chaque ligne tour à tour. Est-ce que ça a fait ce que vous attendiez ? Si c’est le cas, passez à la ligne suivante.
Si non, pourquoi pas ? En quoi est-ce différent ?
Espérons que cela devrait vous aider à localiser quelle partie de ce code présente un problème et quel est le problème.
C’est une compétence qui mérite d’être développée car elle vous aide dans le monde réel ainsi que dans le développement. Et comme toutes les compétences, elle ne s’améliore qu’à l’usage !

コメント

タイトルとURLをコピーしました