Alice, une étudiante, a beaucoup de devoirs au cours des prochaines semaines. Chaque devoir lui prend exactement une journée. Chaque élément a également une date limite et un impact négatif sur ses notes (supposez un nombre réel, des points bonus pour ne supposer que la comparabilité), si elle manque la date limite.
Écrivez une fonction qui donne une liste (échéance, impact sur la note) un calendrier pour les devoirs à faire le jour qui minimise la somme du mauvais impact sur ses notes.
Tous les devoirs doivent être faits éventuellement, mais si elle manque une date limite pour un article, peu importe l'heure à laquelle elle le remet.
Dans une formulation alternative:
ACME corp veut fournir de l'eau aux clients. Ils vivent tous le long d'une rue en montée. ACME a plusieurs puits distribués le long de la rue. Chaque puits contient suffisamment d'eau pour un client. Les clients offrent différents montants d'argent à fournir. L'eau ne coule qu'en descente. Maximisez les revenus en choisissant les clients à approvisionner.
Nous pouvons trier les délais à l'aide du tri par compartiment (ou simplement supposer que nous avons déjà trié par date limite).
Nous pouvons résoudre le problème facilement avec un algorithme gourmand, si nous trions d'abord par impact décroissant de grade. Cette solution ne sera pas meilleure que O (n log n).
Inspiré par la médiane des médianes et les algorithmes d' arbre couvrant linéaire minimal randomisé , je soupçonne que nous pouvons également résoudre mon problème de planification / flux simple en temps linéaire (randomisé?).
Je cherche:
- un algorithme de temps linéaire (potentiellement randomisé)
- ou bien un argument selon lequel le temps linéaire n'est pas possible
Comme tremplin:
- J'ai déjà prouvé que le simple fait de savoir quels éléments peuvent être effectués avant leur échéance est suffisant pour reconstruire le programme complet en temps linéaire. (Cette idée sous-tend la deuxième formulation où je ne pose que des questions sur le certificat.)
- Un programme linéaire simple (intégral!) Peut modéliser ce problème.
- En utilisant la dualité de ce programme, on peut vérifier une solution proposée candidate en temps linéaire pour l'optimalité, si on donne également la solution au programme double. (Les deux solutions peuvent être représentées dans un nombre linéaire de bits.)
Idéalement, je veux résoudre ce problème dans un modèle qui utilise uniquement la comparaison entre les impacts de grade, et ne suppose pas de chiffres là-bas.
J'ai deux approches à ce problème: l'une basée sur des tracés utilisant la date limite et l'impact, l'autre similaire à QuickSelect basée sur le choix d'éléments pivotants aléatoires et le partitionnement des éléments par impact. Les deux ont les pires cas qui forcent O (n log n) ou des performances moins bonnes, mais je n'ai pas été en mesure de construire un cas spécial simple qui dégrade les performances des deux.