Задать вопрос
Kioshilol
@Kioshilol
Student

Правильный ли алгоритм?

Вот формулировка задачки, ограничение на время 5с, на память 256мб, тесты на правильность мой алгоритм не прошёл не могу понять почему, можете помочь разобраться почему, или же посоветовать алгоритм лучше
5e021d7e6fc86064450919.png5e021d88204bf395874882.png
using System;
using System.Linq;

namespace Testing
{
    class Program
    {
        static void Main(string[] args)
        {
            int numberOfTasks = Convert.ToInt32(Console.ReadLine());
            int numberOfTestDevice = Convert.ToInt32(Console.ReadLine());
            int[] testTime = new int[numberOfTasks];

            for (int i = 0; i < numberOfTasks; i++)
            {
                testTime[i] = Convert.ToInt32(Console.ReadLine());
            }

            testTime = SortArray(testTime);
            int totalTime = 0;
            int x= 0;

            for (int i = 1; i <= testTime.Length; i++)
            {
                totalTime += ((x * 2) + 1) * testTime[i - 1];

                if (i % numberOfTestDevice == 0)
                    x++;
            }

            Console.WriteLine(totalTime);
        }

        static int[] SortArray(int[] inputArray)
        {
            int[] countArray = new int[inputArray.Max() + 1];
            for (int i = 0; i < inputArray.Length; i++)
            {
                countArray[inputArray[i]]++;
            }
            int[] sortedArray = new int[inputArray.Length];
            int sortedArrayIndex = 0;
            for (int i = countArray.Length-1; i >=0; i--)
            {
                for (int j = 0; j < countArray[i]; j++)
                {
                    sortedArray[sortedArrayIndex++] = i;
                }
            }
            return sortedArray;
        }
    }
}
  • Вопрос задан
  • 129 просмотров
Подписаться 1 Простой 2 комментария
Пригласить эксперта
Ответы на вопрос 2
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Судя по примеру, задачи должны выполняться последовательно, но каждая следующая может быть запущена на произвольном устройстве.
Значит сортируем задачи по времени в убывающем порядке и запускаем на устройствах по кругу.
function allTestsTime(numDevices, testTimes) {
  testTimes.sort((a, b) => b - a);
  let totalTime = 0;
  for (let i = 0; i < testTimes.length; i++) {
    totalTime += testTimes[i] * (2 * Math.floor(i / numDevices) + 1);
  }
  return totalTime;
}

console.log(allTestsTime(3, [6, 2, 5]));

// 13
Ответ написан
wataru
@wataru Куратор тега Математика
Разработчик на С++, экс-олимпиадник.
Очень похоже на переполнение. Попробуйте тест, где одно устройство и миллион задач по 100 каждая.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы