En fait, tu veux un algorithme plutôt qu'une formule, non ?
Une formule unique ne peut pas exister...
Voilà ce que je te propose.
La fonction f(t) qui donne le nombre de pièces construites au temps t est une fonction affine par morceaux : sa représentation serait une suite de segments connexes.
Soit la fonction g(t) qui donne, à un instant t, le nombre d'ouvriers en oeuvre. Soit A le rythme de confection des pièces.
A tout moment, la dérivée f' de f est telle que f'(t) = g(t)*A (en prenant t en heures)
Il n'est pas trop compliqué de définir g(t) : c'est une fonction par palliers, qui vaut 0 à t=0, dont la valeur augmente de 1 chaque fois qu'un ouvrier arrive et diminue de 1 quand un ouvrier part.
Décrivons tout cela de façon informatique (je ne prétends pas optimiser la complexité de l'algorithme)
Définissons un objet HEURE.
HEURE contient deux valeurs :
- H, qui est l'heure en elle-même,
- Type, qui vaut +1 si c'est une heure d'arrivée, et -1 si c'est une heure de départ.
Soit PALLIERS() la liste ordonnée des HEURE de rotation (donc, toutes les heures de début et toutes les heures de fin)
Soit la fonction g, qui prend en paramètre une heure, et renvoie un nombre.
g(T) :
{
renvoie (somme de HEURE.Type pour toutes les HEURE où HEURE.H < T)
}Soit la fonction heureFinale(), qui fait ce que tu veux. Elle prend un argument entier (le nombre d'objets), et renvoie l'heure où c'est atteint.
heureFinale(QTE) :
{
PiecesCreees = 0;
HeurePrecedente = 0;
Pour chaque PIVOT dans PALLIERS()
{
PiecesCreeesDuPallier = A*g(PIVOT.H)*(PIVOT.H-HeurePrecedente);
SI (PiecesCreees + PiecesCreeesDuPallier >=QTE)
{
Renvoie (PIVOT.H + (QTE-PiecesCreees) / (A*g(PIVOT.H)) )
}
HeurePrecedente = PIVOT.H
PiecesCreees = PiecesCreees + PiecesCreeesDuPallier
}
Renvoie -1
}Pfiou, voilà :)
Tout le problème me semble formalisé. Le principe, donc, globalement : parcourir toutes les heures "spéciales" dans l'ordre, et ajouter à chaque fois la quantité produite : quand on dépasse, on regarde plus précisément pour trouver le moment où cela a dépassé.
Si tu a un langage précis dans lequel tu veux que je traduise l'algorithme, ça peut se faire.
En espérant t'avoir plus aidé que saoûlé ;)
Xavier