-3
votes

Comment résoudre le problème ci-dessous du livre de dessin

Problème de Hackerrank Livre de dessin.

Le professeur de dessin de Brie demande à sa classe d'ouvrir leurs livres à un numéro de page. Brie peut commencer à tourner les pages à partir du début du livre ou du dos du livre. Elle tourne toujours les pages une par une. Lorsqu'elle ouvre le livre, la page 1 est toujours sur le côté droit:

entrez la description de l'image ici

Lorsqu'elle passe à la page 1, elle voit les pages 2 et 3. Chaque page, sauf la dernière, sera toujours imprimée des deux côtés. La dernière page ne peut être imprimée qu'au recto, compte tenu de la longueur du livre. Si le livre fait n pages et qu'elle souhaite passer à la page p, quel est le nombre minimum de pages qu'elle va tourner? Elle peut commencer au début ou à la fin du livre.

Étant donné n et p, recherchez et imprimez le nombre minimum de pages que Brie doit tourner pour arriver à la page p.

Description de la fonction

Complétez la fonction pageCount dans l'éditeur ci-dessous. Il doit renvoyer le nombre minimum de pages que Brie doit tourner.

pageCount a le (s) paramètre (s) suivant (s):

  • n: le nombre de pages du livre
  • p: le numéro de page vers lequel se tourner

Format d'entrée

La première ligne contient un entier n, le nombre de pages du livre. La deuxième ligne contient un entier, p, la page vers laquelle l'enseignant de Brie veut qu'elle se tourne.

Contraintes

entrez la description de l'image ici

Format de sortie

Imprime un entier indiquant le nombre minimum de pages que Brie doit tourner pour accéder à la page p.

Exemple d'entrée 0

0

Exemple de sortie 0

5
4

entrez la description de l'image ici

Exemple d'entrée 1

1

Exemple de sortie 1

6
2

=================================================== =


0 commentaires

3 Réponses :


1
votes

Il faut se rendre compte que 2 pages forment une unité, en utilisant la division entière par 2.

Vous n'avez pas utilisé la division entière par suppression du reste, où 12/7 == 1.

static int pagesTurnCount(int n, int p) {
    n /= 2; // >>= 1
    p /= 2;
    return Math.min(p, n - p); // From front, from back
}

       p
 0  >  1  <  2  <  3      page pairs
- 1   2 3   4 5   6 -     pages

Le programmeur basé sur zéro doit être conscient que ce dernier index pour les doubles pages est en effet "le nombre de pages" n divisé par 2.


0 commentaires

1
votes

Chaque fois qu'une page est tournée, 2 pages supplémentaires deviennent visibles. Donc, cela signifie que dans le pire des cas, l'enseignant a besoin de n/2 tours pour passer de la première page à la dernière. Cependant, comme elle est également autorisée à se retourner à partir de la fin du livre, elle peut faire le pire des cas en n/4 flips.

Donc, si son numéro de page est p <= n/2 , alors elle a besoin de p/2 flips, sinon - n/2 - p/2 pas ou juste min(p/2, (n/2) - (p/2)) :

int pageCount(int n, int p) {
    return Math.min(p / 2, (n/2) - (p/2));
}

ÉDITER

Puisqu'une solution en JAVA est requise, je l'ajoute ici:

uint32_t pageCount(uint32_t n, uint32_t p) {
    return std::min(p / 2, (n/2) - (p/2));
}


0 commentaires

0
votes
def pageCount(n, p):
    if p==n or p==1:
        c=0
    elif n%2!=0 and p==n-1:
        c=0
    else:
        if p%2==0:
            if n%2==0:
                c=min(p/2,(n-p)/2)
            else:
                c=min(p/2,(n-p-1)/2)
        else:
            if n%2==0:
                c=min((p-1)/2,(n-p+1)/2)
            else:
                c=min((p-1)/2,(n-p)/2)
return int(c)

0 commentaires