using LR1_2; using System; using System.Linq; string filePath = "C:\\Users\\79237\\Downloads\\Перенос\\Documents\\ВУЗ\\PRiTPO\\LR1_2\\LR1_2\\input.txt"; // Путь к файлу с данными string[] lines = File.ReadAllLines(filePath); int blockstoparse = Convert.ToInt32(lines[0]); int blocksparsed = 0; int lastline = 1; CEntry[] EntryArray = new CEntry[lines.Length]; while (blocksparsed < blockstoparse) { Console.WriteLine($"БЛОК {blocksparsed+1}"); List participants = new List(); int entriescount = 0; for (int i = lastline+1; i <= lines.Length; i++) { if (lines[i] == "") { blocksparsed++; lastline = i; break; } else { string[] numbers = lines[i].Split(' '); CEntry newEntry = new CEntry(); newEntry.id = Convert.ToInt32(numbers[0]); newEntry.tasks = Convert.ToInt32(numbers[1]); newEntry.time = Convert.ToInt32(numbers[2]); newEntry.status = Convert.ToChar(numbers[3]); if (participants.FirstOrDefault(part => part.id == newEntry.id) == default) participants.Add(new CParticipant(newEntry.id, 0, 0)); EntryArray[entriescount] = newEntry; entriescount++; if (i == lines.Length - 1) { blocksparsed++; lastline = i; break; } } } //проверяем максимальное количество задач var maxTasksDone = 0; foreach (var participant in participants) { List TasksDonebyParticipant = new List(); for (int i = 0; i maxTasksDone) maxTasksDone = participant.tasksdone; } //выведем всех, кто сделал наибольшее кол-во задач, в отдельный список. List participantsToCheck = new List(); foreach (var participant in participants) if (participant.tasksdone == maxTasksDone) participantsToCheck.Add(participant); //считаем время для всех foreach (var participant in participants) { int[] finishedtasks = new int[entriescount];//размер массива такой, потому что сколько всего было отправлено — столько и есть максимальное кол-во решённых задач for (int i = 0; i < entriescount; i++)//проходимся по всем отправлениям в первый раз, попутно записываем в список все решённые участником задачи. если пройтись только один раз, есть шанс что-то упустить { if (EntryArray[i].status == 'C' && EntryArray[i].id == participant.id) { participant.totaltime += EntryArray[i].time; finishedtasks[i] = EntryArray[i].tasks; } } for (int i = 0; i < entriescount; i++) //проходимся ещё раз, чтобы абсолютно всем решённым задачам посчитать штрафное время if (EntryArray[i].status == 'I' && EntryArray[i].id == participant.id && finishedtasks.Contains(EntryArray[i].tasks)) participant.totaltime += 20; } var finals = from participant in participants orderby participant.tasksdone descending, participant.totaltime ascending, participant.id ascending select participant; foreach (var participant in finals) Console.WriteLine(String.Concat(participant.id) + " " + String.Concat(participant.tasksdone) + " " + String.Concat(participant.totaltime)); Console.WriteLine(); }