7
votes

Comment allez-vous vous attaquer à cet exercice?

Intro:

Edit: Voir la solution au bas de cette question forte> (C ++) p>

J'ai un concours de programmation à venir dans un peu, et j'ai Préparez :) p>

Je pratique à l'aide de ces questions: p>

http://cemc.math.uwaterloo.ca/ContestS/computing/2009/stage2/day1.pdf P>

Je cherche Au problème B ("dîner"). P>

aucune idée où commencer? Je ne peux pas vraiment penser à rien d'autre que l'approche naïve (c.-à-d. Essayer toutes les permutations) qui prendraient trop de temps pour être une réponse valide. P>

BTW, la langue indique C ++ et Pascal je pense, mais Je me fiche de quelle langue que vous utilisez - je veux dire vraiment tout ce que je veux, c'est un indice quant à la direction que je devrais procéder et perhpas une courte explication pour aller avec elle. On me semble manquant quelque chose d'évident ... p>

Bien sûr, la spéculation prolongée est plus que la bienvenue, mais je voulais juste préciser que je ne cherche pas une solution complète ici :) P >


Version courte de la question: h2>

Vous avez une chaîne binaire N de longueur 1-100 (dans la question qu'elles utilisent H's et G à la place de ses et de 0). Vous devez supprimer tous les chiffres de celui-ci, dans le moins le moins de étapes possibles forts>. À chaque étape, vous pouvez supprimer n'importe quel nombre de chiffres adjacents tant qu'ils sont les mêmes. C'est-à-dire que, à chaque étape, vous pouvez supprimer n'importe quel nombre de G adjacents, ou un nombre quelconque de H adjacent, mais vous ne pouvez pas supprimer H'S et G en une étape. P>

Exemple: P>

95 2
GGHHGGHHGGHHGGHHGGHHGGHHGGHHGGHHGGHHGGHHGGHHGGHHGGHHGGHHGGHHGGHHGHGHGHGHGHGHGHGHGHGHGHGHGHGHGHG


4 commentaires

Non, malheureusement, vous ne pouvez rien déplacer en dehors de l'exécution des déménagements comme décrit.


Tri de la liste ferait la réponse toujours 1 ou 2, ce que je ne pense pas était l'effet prévu.


Épaules et aller pour les genoux.


C'est la taille des paires adjacentes qui rendent cela intéressant. S'il était fixé à 2 ou plus, la réponse de @ Paradigm est la meilleure, mais les groupes signifie que vous devrez frapper le bon ordre pour obtenir suffisamment de lettres pour pouvoir les supprimer.


3 Réponses :


1
votes

Ce problème devient un peu plus simple si vous traitez respectivement 1 h ou consécutif G d'environ 1 h ou 1 g (elles sont traitées de la même manière, dans cette GHHHHHG et GES nécessiteraient le même nombre de déménagements).

Cela réduit le problème à un ensemble de H et alternance d'alternance. À ce stade, en supprimant tout le nombre inférieur des 2 vous donnerait la quantité d'opérations nécessaires (plus 1 pour les "autres" lettres restantes).

algorithme peut être fait dans O (n):

  • Gardez un compteur pour H et un compteur pour G.
  • Commencez au premier caractère et incrémentez le compteur approprié par 1.
  • Allez au caractère suivant et s'il est identique à celui du précédent, continuez jusqu'au prochain.
  • Si c'est différent, incrémentez le compteur pour le nouveau caractère.
  • Continuez le même processus, incrémentant le compteur approprié à chaque fois que le caractère change de la précédente.

    Après itération à travers l'ensemble, la réponse doit être le moindre des 2 comptoirs (nombre de déménagements nécessaires pour supprimer le plus petit nombre de caractères), plus 1 (pour les "autres" caractères, qui resteront). < / p>

    Y a-t-il un moyen plus rapide? (et cela fonctionne-t-il réellement?)


3 commentaires

Cela ne fonctionnera probablement pas. Ils disent que le nombre maximum de SH et de GS est 100 - donc je m'attends à quelque chose de moins efficace que O (N) à coup sûr. Je peux voir ce que vous essayez de faire ici. Mais il y a des cas plus compliqués où cela ne fonctionnerait pas. Merci quand même!


En fait, bien que votre idée de les traiter comme des «ensembles» est assez intelligente.


+1 - Voir ma question mise à jour pour la solution finale. Votre idée de regroupement (le regrouper dans des ensembles) était très utile!



2
votes

Ces étapes:

  • Recherchez un motif tel que H + G + H +. Retirez un G + qui laisse une H + Calescée où un ou plusieurs de l'original H + H + n'auraient pas pu être supprimés en raison de la restriction de longueur. Sinon, retirez le plus long combiné H +.
  • De même pour G + H + G +.

    Répétez les étapes ci-dessus. Chaque étape va coalera un groupe plus large de H + ou G +.

    Finalement, vous aurez une H + et un g + (en supposant que vous aviez les deux H et G pour commencer). Supprimer ceux-ci.

    (h +, g + signifie x ou plus h ou g, où x est le nombre minimum pouvant être supprimé à la fois.)


8 commentaires

Sauf si je me trompe: c'est simplement un moyen de se débarrasser de tous les H et G. Cependant, ce dont j'ai besoin est une méthode pour les supprimer dans le moins de pas de mesures possibles , puis sur le nombre de mesures qu'il faudrait.


Mis à jour pour supprimer le g + qui donne la plus longue goaled H +. Je pense que cela le fera pour vous.


Hmm. Semble prometteur - bien que je me demande s'il y a des cas où cela ne fonctionnera pas. Je vais essayer et posterai.


Je pense qu'ils peuvent essayer de vous tromper dans la sortie de certains H + ou G + qui sont trop courts pour être supprimés, il est donc important de veiller à ce que l'algorithme se concentre sur ne pas quitter H + ou G + Stragglers. J'ai mis à jour la première étape pour le refléter.


Merci. Au fait, comment allez-vous classer ce problème? Bien que cela soit cool d'avoir celui-ci résolu, j'aimerais particulièrement pouvoir reconnaître d'autres problèmes similaires, ainsi que des recherches supplémentaires sur des problèmes tels que celui-ci.


Brillant!! Cela a fonctionné parfaitement - a du sens totalement! Voir le code dans ma question mise à jour.


Heureux d'aider, votre solution est belle. Bonne chance à la compétition!


@Cam Le nombre d'étapes pour supprimer tous les chiffres est toujours plancher ((nombre de groupes) / 2 + 1) .



0
votes

Eh bien, voici une pensée - une perte de généralité, vous pouvez remplacer les séquences de GS et HS avec le nombre repoussant le nombre de lettres du groupe.

Prenons le cas # 2: GGGHHHGGGHHHHHHHGG - Il devient 2 1 2 2 3 2 1 2 1 2 2

Supprimer un groupe de lettres et la fusion des deux voisins élimine un nombre et remplacer les deux adjacents avec leur somme: 2 1 2 2 3 2 1 2 1 2 2 -> 2 1 2 4 1 2 1 2 2 -> 2 1 2 4 1 2 3 -> 2 1 3 2 3 -> 2 3 3 3 -> 5 -> nil

Si vous remarquez, chaque fois que nous retirons un groupe du milieu (non supérieur ou le plus à droite), la longueur diminue de 2, le nombre d'étapes nécessaires semble être autour de N / 2 (où n est la longueur de La liste des chiffres que nous avons commencés à partir de) - La torsion étant que si N était même numéro un nombre, à la fin, vous aurez une liste de 2 éléments qui seront effacés en 2 étapes (donc +1 étape supplémentaire).

Il me semble donc que le nombre optimal d'étapes est toujours = trunc ((n + 1) / 2) - si est possible. Ainsi, le travail semble être plus du genre de découverte s'il est possible de réduire la chaîne H-G - si c'est le cas, nous connaissons le nombre de marches minimums.

pensées?


0 commentaires