3 votes

Round robin en C#

J'ai un problème (peut-être dû à un manque de sommeil !) où j'essaie de résoudre un problème de maths en C#.

Disons que j'ai un distributeur de boissons, et que j'ai trois rangées vides qui peuvent être remplies de Cola. J'ai 17 canettes de Cola en main et je dois remplir chaque rangée une par une.

Par exemple...

Passe 1 :

Ajouter Cola à la rangée 1. Boissons = 1
Ajoutez Cola à la rangée 2. Boissons = 1
Ajoutez Cola à la rangée 3. Boissons = 1

Passez 2 :

Ajouter Cola à la rangée 1. Boissons = 2
Ajoutez Cola à la rangée 2. Boissons = 2
Ajoutez Cola à la rangée 3. Boissons = 2

...

Passez 6

Ajouter Cola à la rangée 1. Boissons = 6
Ajoutez Cola à la rangée 2. Boissons = 6
Ajoutez Cola à la rangée 3. Boissons = 5 (il ne reste plus de boissons à ce stade)

Pour une raison quelconque, je suis complètement perdu. Quelqu'un peut-il m'aider ?

6voto

Eric Points 35647

C'est assez rapide et sans douleur, et cela ne nécessite qu'une seule boucle, et non deux boucles imbriquées. Tout ce dont vous avez besoin, c'est d'un peu de mathématiques pour obtenir l'index correct du tableau :

int[] Cola = {0,0,0};
int Rows = Cola.Length;
int Drinks = 17;

for (int i = Drinks; i > 0; i--)
{
   Cola[(Drinks - i) % Rows]++;
}

Console.WriteLine("Row 1 has " + Cola[0] + " cans.");
Console.WriteLine("Row 2 has " + Cola[1] + " cans.");
Console.WriteLine("Row 3 has " + Cola[2] + " cans.");

Cela produit ceci comme résultat :

Row 1 has 6 cans.
Row 2 has 6 cans.
Row 3 has 5 cans.

2voto

Guffa Points 308133

Au lieu de faire une boucle pour ajouter une boîte à la fois, vous pouvez calculer le nombre de boîtes que recevra chaque rangée :

int cans = 17;
cans += machine.Rows.Count;
for(int i = 1; i <= machine.Rows.Count; i++) {
   Console.WriteLine("Row {0} has {1} cans.", i, --cans / machine.Rows.Count);
}

1voto

Kevin Montrose Points 11936

Tirer depuis la hanche :

int numDrinks = /* Your constant here */
int[] drinksInRow = new int[NUM_ROWS];
for(int i = 0; i < drinksInRow.Length; i++)
{
  drinksInRow[i] = numDrinks / NUM_ROWS;
  if(i < numDrinks % NUM_ROWS) drinksInRow[i]++;
}

le nombre de boissons dans chaque rangée est en drinksInRow indexé par le numéro de ligne à partir de 0.

C'est plus rapide que de faire des passes répétées ; en gros, c'est O(NUM_ROWS) [si on joue vraiment lâche avec Big-O].

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X