Недавно только я решал раунд 311.Как всегда, ориентируясь на свои силы, я попытался решить задачу A.Решение прошло всего 3 теста, на 4 падало.Я не знал почему, не догадывался.После окончания раунда я посмотрел решения других и некоторые тесты, и тест 4 соответственно.Проверив на своем компьютере, я получил исключение "System.OutOfMemoryException", что означает переполнение памяти.Пока решал у меня были сомнения, что будет что-то подобное, поскольку три диапазона чисел, следовательно, дерево с тремя уровнями, и три цикла вложенных друг в друга.При малых n-количество дипломов, такое решение даже проходит, но при больших приводит к зависанию.Вот мой код бестолковый.
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace ConsoleApplication6
{
class Program
{
static void Main(string[] args)
{
int n=Convert.ToInt32(Console.ReadLine());
string str1 = Console.ReadLine();
string str2 = Console.ReadLine();
string str3 = Console.ReadLine();
string[] strin1 = str1.Split(' ');
string[] strin2 = str2.Split(' ');
string[] strin3 = str3.Split(' ');
long min1 = long.Parse(strin1[0]);
long max1 = long.Parse(strin1[1]);
long min2 = long.Parse(strin2[0]);
long max2 = long.Parse(strin2[1]);
long min3 = long.Parse(strin3[0]);
long max3 = long.Parse(strin3[1]);
long [, ,] mass=new long[max1-min1+1,max2-min2+1,max3-min3+1];
for (long i = max1; i >=min1; i--) {
for (long j = max2; j >= min2; j--) {
for (long k = max3; k >=min3; k--) {
if (i + j + k == n)
{
mass[i - min1, j - min2, k - min3] = 1;
}
else { mass[i - min1, j - min2, k - min3] = 0; }
}
}
}
string s="";
for (long k = max3; k >= min3; k--)
{
for (long j = max2; j >= min2; j--)
{
for (long i = max1; i >= min1; i--)
{
if (mass[i - min1, j - min2, k - min3] ==1){
s=i.ToString()+" "+j.ToString()+" "+k.ToString();
break;
}
}
}
}
Console.WriteLine(s);
Console.ReadLine();
}
}
}
Ты пытаешься создать массив размером . Конечно, память кончится. Тут нужно линейное решение, а не кубическое.