Advertisement
joro_thexfiles

Problem 7. Truck Tour

Jan 16th, 2020
1,060
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 3.77 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4.  
  5. namespace Problem_7.__Truck_Tour
  6. {
  7.     class Program
  8.     {
  9.         static void Main(string[] args)
  10.         {
  11.             int countOfPumps = int.Parse(Console.ReadLine());
  12.  
  13.             var original = new Queue<int>();
  14.  
  15.             int index = 0;
  16.  
  17.             //Тук прочитам всички входни данни и ги записвам в опашка original
  18.             for (int i = 0; i < countOfPumps; i++)
  19.             {
  20.                 int[] input = Console.ReadLine()
  21.                     .Split()
  22.                     .Select(int.Parse)
  23.                     .ToArray();
  24.                 original.Enqueue(input[0]);
  25.                 original.Enqueue(input[1]);
  26.             }
  27.  
  28.             // тук въртя всяка една двойка стойности от оригиналната опашка, като всяка я проверявам дали литрите, които ще заредя ще ми стигнат (> или =) до следващата бензиностанция. Ако не ми стигнат значи тази двойка стойности отива най-отзад в опашката. Ако обаче си хвана двойка стойности където литрите са достатъчни или повече от дистанцията, то тогава тази двойка с-сти може да ми е стартова и да обиколя целия кръг докато отново стигна до тях. За това във вътрешен цикъл започвам да проверявам всички останали двойки след началната дали горивото винаги ще ми е над нулата, защото ако е под значи няма да мога да стигна до следващата бензиностанция. При всяко завъртане на вътрешния цикъл (когато горивото е >=0) вадя по една двойко стойности докато свършат. След като copy опашката няма никакви елементи остава да проверя дали в leftFuel ми е останало гориво.
  29.             while (true)
  30.             {
  31.                 var copy = new Queue<int>(original);
  32.  
  33.                 long litres = copy.Dequeue();
  34.                 long distance = copy.Dequeue();
  35.                                
  36.                 if (litres < distance)
  37.                 {
  38.                     original.Enqueue(original.Dequeue());
  39.                     original.Enqueue(original.Dequeue());
  40.                 }
  41.                 else if (litres >= distance)
  42.                 {
  43.                     long leftFuel = litres - distance;
  44.  
  45.                     while (copy.Any())
  46.                     {
  47.                         var litresInternal = copy.Dequeue();
  48.                         var distanceInternal = copy.Dequeue();
  49.  
  50.                         if (litresInternal + leftFuel >= distanceInternal)
  51.                         {
  52.                             leftFuel = litresInternal + leftFuel - distanceInternal;
  53.                         }
  54.                         else
  55.                         {
  56.                             original.Enqueue(original.Dequeue());
  57.                             original.Enqueue(original.Dequeue());
  58.                             leftFuel = -1;
  59.                             break;
  60.                         }
  61.                     }
  62.  
  63.                     if (leftFuel >= 0)
  64.                     {
  65.                         Console.WriteLine(index);
  66.                         break;
  67.                     }
  68.                 }
  69.                 index++;
  70.             }
  71.         }
  72.     }
  73. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement