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:
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
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
Exemple d'entrée 1
1
Exemple de sortie 1
6 2
=================================================== =
3 Réponses :
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.
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));
}
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)