Jonson.cs 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. using System;
  2. using System.Collections.Generic;
  3. using System.ComponentModel.DataAnnotations;
  4. using System.Linq;
  5. using System.Text;
  6. using System.Threading.Tasks;
  7. namespace Method_Jonson
  8. {
  9. internal class Jonson
  10. {
  11. public void Jonson_Method()
  12. {
  13. Console.WriteLine("Введите время выполнения работы 1 станка через пробел");
  14. string string1 = Console.ReadLine(); //Поле ввода 1-го столбца
  15. List<int> list_old1 = string1.Split(' ').Select(x => Convert.ToInt32(x)).ToList(); //Лист для исходных данных 1-го ст
  16. Console.WriteLine("Введите время выполнения работы 2 станка через пробел");
  17. string string2 = Console.ReadLine(); //Поле ввода 2-го столбца
  18. List<int> list_old2 = string2.Split(' ').Select(x => Convert.ToInt32(x)).ToList(); //Лист для исходных данных 2-го ст
  19. List<int> list_calculation_old = new List<int>(); //Лист подсчета времени
  20. int count_index = list_old1.Count;
  21. if (Bool_Proverka_Sum(list_old1, list_old2) == true)
  22. {
  23. for (int i = 0; i <= count_index; i++) //Подсчет времени для исходных данных
  24. {
  25. if(i==0) list_calculation_old.Add(list_old1[i]);
  26. else
  27. {
  28. list_calculation_old.Add(list_old1.Take(i).Sum() + (-1) * list_old2.Take(i - 1).Sum());
  29. }
  30. }
  31. Console.WriteLine("Оценка при начальных данных: "+list_calculation_old.Max());
  32. List<int> list_new1 = new List<int>(); //Два листа новых для оптимальности
  33. List<int> list_new2 = new List<int>();
  34. for (int i = count_index-1; i >= 0; i--) //Цикл перетаскивания строк по алгоритму
  35. {
  36. int min_el = Math.Min(list_old1.Min(),list_old2.Min());
  37. if(list_old1.IndexOf(min_el) != -1)
  38. {
  39. int min_index = list_old1.IndexOf(min_el);
  40. list_new1.Add(list_old1[min_index]);
  41. list_new1.Add(list_old2[min_index]);
  42. list_old1.RemoveAt(min_index);
  43. list_old2.RemoveAt(min_index);
  44. }
  45. else
  46. {
  47. int min_index = list_old2.IndexOf(min_el);
  48. list_new2.Add(list_old2[min_index]);
  49. list_new2.Add(list_old1[min_index]);
  50. list_old2.RemoveAt(min_index);
  51. list_old1.RemoveAt(min_index);
  52. }
  53. }
  54. list_calculation_old.Clear(); //Очистка листа
  55. list_new2.Reverse();
  56. List<int> list_new_calc1 = new List<int>();
  57. List<int> list_new_calc2 = new List<int>();
  58. for (int i = 0; i < list_new1.Count; i++)
  59. {
  60. i++;
  61. list_new_calc1.Add(list_new1[i - 1]);
  62. list_new_calc2.Add(list_new1[i]);
  63. }
  64. for (int i = 0; i < list_new2.Count; i++)
  65. {
  66. i++;
  67. list_new_calc1.Add(list_new2[i - 1]);
  68. list_new_calc2.Add(list_new2[i]);
  69. }
  70. for (int i = 1; i < list_new_calc1.Count; i++) //Сортировка
  71. {
  72. if (list_new_calc1[i] == list_new_calc1[i - 1])
  73. {
  74. if (list_new_calc2[i] > list_new_calc2[i - 1])
  75. {
  76. int cup = list_new_calc2[i - 1];
  77. list_new_calc2[i-1] = list_new_calc2[i];
  78. list_new_calc2[i] = cup;
  79. }
  80. }
  81. else if (list_new_calc2[i] == list_new_calc2[i - 1])
  82. {
  83. if (list_new_calc1[i] < list_new_calc1[i - 1])
  84. {
  85. int cup = list_new_calc1[i - 1];
  86. list_new_calc1[i - 1] = list_new_calc1[i];
  87. list_new_calc1[i] = cup;
  88. }
  89. }
  90. }
  91. for (int i = 0; i <= count_index; i++) //Подсчет времени сортированных столбцов
  92. {
  93. if (i == 0) list_calculation_old.Add(list_new_calc1[i]);
  94. else
  95. {
  96. list_calculation_old.Add(list_new_calc1.Take(i).Sum() + (-1) * list_new_calc2.Take(i - 1).Sum());
  97. }
  98. }
  99. for (int i = 0; i < list_new_calc1.Count; i++) //Вывод
  100. {
  101. Console.WriteLine(list_new_calc1[i]+" " + list_new_calc2[i]);
  102. }
  103. Console.WriteLine("Оценка после метода: " + list_calculation_old.Max());
  104. }
  105. }
  106. public bool Bool_Proverka_Sum(List<int> list1, List<int> list2) //Проверка на то, чтобы сумма 1-го столбца была больше 2-го
  107. {
  108. if (list1.Sum() > list2.Sum()) return true;
  109. else return false;
  110. }
  111. }
  112. }