ahmedarifhasan Ответов: 3

Первые два тестовых случая успешны, но для остальных компилятор показывает "превышен лимит времени".


Страница Конкурса | CodeChef[^]
Это и есть ошибка->
"Ошибка Времени Выполнения: Превышен Лимит Времени."
Некоторые люди предлагали использовать глобальное объявление массива, но это тоже не работает, в основном мне нужен какой-то способ, с помощью которого я могу сократить время выполнения.
А как насчет использования указателей здесь?
PS - новичок здесь и очень-очень слаб в указателях.

Что я уже пробовал:

#include<stdio.h>

int main()

{

long long int c, se = 0, so = 0, fs = 0, r , k , t , n , i , j;

scanf("%lld",&t);

  for(k = 0 , fs = 0 ; k< ; t ; k++)

  { 

    scanf("%lld",&n);

      for(i = 1; i< = n; i++)

    {

     for( j = 1 ; j< = n ; j++)
  
    {
      c = i + j;

      while(c > 0)

      {

        r=c % 10;

        if(r % 2 == 0)

        se= se + r;

        else

        so= so + r;

        c= c/10;

       }

       if( se > so)

         {

               fs= fs + ( se - so ); se = 0 ;so = 0;

         } 

         else

         {

           fs = fs + ( so - se ); se = 0;so = 0;

         } 

     }

}

printf("%lld\n",fs);

fs = 0;

}

}

-> though this was accepted but for large numbers it displayed "Time limit 
exeeded".

Patrice T

Показать точное сообщение об ошибке и положение.

ahmedarifhasan

"Ошибка выполнения: ваш код скомпилирован и запущен, но обнаружена ошибка. Наиболее распространенные причины-использование слишком большого объема памяти." Некоторые люди предлагали использовать глобальное объявление массива, но это тоже не работает, в основном мне нужен какой-то способ, с помощью которого я могу ввести такой огромный массив.

Patrice T

Воспользуйся Улучшить вопрос чтобы обновить ваш вопрос.
Чтобы каждый мог обратить внимание на эту информацию.

ahmedarifhasan

Спасибо! :)

Richard MacCutchan

Вы пытаетесь использовать длинный массив размером 100 000 х 100 000, то есть 640 гигабайт!

ahmedarifhasan

Спасибо всем вам за помощь, я действительно ценю всех вас, люди, за то, что вы нашли время, чтобы ответить на мой запрос.

Richard MacCutchan

Это не компилятор, который показывает SEGV, это ваша программа. И это неудивительно со всем этим непонятным кодом, который у вас есть.

Richard MacCutchan

Пожалуйста, отредактируйте свой вопрос и избавьтесь от всех этих лишних пустых строк, они затрудняют чтение.

3 Ответов

Рейтинг:
5

Richard MacCutchan

Попробуйте метод поцелуя, то есть держите его простым, глупым.

Начните с основной задачи N строк и N столбцов дает общее количество комнат.

N = 3 // simple test value
totalDiamonds = 0
FOR row = 1 to N 
BEGIN
    FOR column = 1 to N 
    BEGIN
        roomNumber = row + column
        evenDigits = // calculate the sum of even digits
        oddDigits = // calculate the sum of odd digits
        diamonds = ABS(evenDigits - oddDigits)
        print roomNumber ": " diamonds
        totalDiamonds += diamonds
    END
END
print "Total number of diamonds: " totalDiamonds

Из этого вы можете проверить большие значения N.
Как только вы будете довольны этим, вы можете добавить код, чтобы получить различные значения T и цикл через несколько значений N. Оператор print во внутреннем цикле предназначен только для отладки и может быть удален, когда код успешно работает.


ahmedarifhasan

я опубликовал аналогичное решение выше, но это превышает лимит времени. :(

Richard MacCutchan

Мой код-это всего лишь отправная точка для решения основных задач. Ваша задача-найти способы улучшить его, чтобы он работал как можно быстрее. Я никогда раньше не смотрел на CodeChef, так что мне больше нечего предложить.

Рейтинг:
26

CPallini

Для таких вычислений массивы не нужны. Измените свой код, чтобы получать результаты на лету.


ahmedarifhasan

не могли бы вы подробнее рассказать об этом?

CPallini

учитывая номер комнаты (или координаты комнаты {row,col}), ее количество алмазов может быть вычислено и суммировано. Вам не нужно хранить в массиве количество алмазов в каждой комнате.

ahmedarifhasan

Огромное спасибо. ну, я послал вам приглашение на linkedIn, пожалуйста, примите его.

Рейтинг:
16

Patrice T

Это конкурс codeChef, это означает, что ответ никогда не бывает самым прямым.
Весь сайт codeChef посвящен оптимизации, оптимизация - это сокращение времени выполнения и сокращение объема памяти.
Другими словами, для всего, что вы делаете, вы должны спросить себя, почему вы что-то делаете, каково использование, действительно ли это нужно.
ка! ваш огромный массив хранит результат простого добавления, и каждый элемент используется повторно только один раз, вы можете избавиться от этого массива.
Оптимизация также умна: с помощью листа бумаги и карандаша нарисуйте дом 20*20 и напишите номер каждой комнаты, вы должны увидеть шаблон, который приведет к огромной оптимизации.
-----
Стиль кодирования: научитесь правильно отступать ваш код, он показывает свою структуру, и это помогает читать и понимать.

#include<stdio.h>
int main()
{
  long long int se=0,so=0,fs=0,r,k,t,n,i,j,a[100000][100000];
  scanf("%lld",&t);
  fs=0;
  for(k=0;k<t;k++)
  {
    scanf("%lld",&n);
    for(i=1;i<=n;i++)
    {
      for(j=1;j<=n;j++)
      {
        a[i][j]=i+j;
      }
    }
    fs=0;
    for(i=1;i<=n;i++)
    {
      for(j=1;j<=n;j++)
      {
        while(a[i][j]>0)
        {
          r=a[i][j]%10;
          if(r%2==0)
            se=se+r;
          else
            so=so+r;
          a[i][j]=a[i][j]/10;
        }
        if(se>so)
        {
          fs=fs+(se-so);se=0;so=0;
        }
        else
        {
          fs=fs+(so-se);se=0;so=0;
        }
      }
    }
    printf("%lld\n",fs);
  }
}

Профессиональные редакторы программистов имеют эту функцию и другие, такие как сопоставление скобок и подсветка синтаксиса.
Блокнот++ Главная Страница[^]
личные[^]

[Обновление]
Цитата:
хотя это было принято, но для больших чисел он показывал "ограничение по времени истекло"

Потому что вам нужно найти дальнейшую оптимизацию. Именно тогда эта часть первого поста вступает в игру.
Цитата:
Оптимизация также является умной/умной: с помощью листа бумаги и карандаша нарисуйте дом 20*20 и напишите номер каждой комнаты, вы должны увидеть шаблон, который приведет к огромной оптимизации.


ahmedarifhasan

да я удалил массив:

#включить<stdio.h>

тап_п()

{

длинный инт с, ЮВ = 0, поэтому = 0, ФС = 0, Р , К , т , н , I и J;

scanf ("%lld",&t);

для(k = 0 , fs = 0 ; k&lt ; t ; k++)

{

scanf("%lld",&n);

для(i = 1; i< = n; i++)

{

для( j = 1 ; j< = n ; j++)

{
c = i + j;

а(с &ГТ; 0)

{

r=c % 10;

если(r % 2 == 0)

se= se + r;

еще

so= so + r;

c= c/10;

}

если( se > so)

{

fs= fs + ( se - so ); se = 0 ;so = 0;

}

еще

{

fs = fs + ( so - se ); se = 0;so = 0;

}

}

}

printf("%lld\n",fs);

fs = 0;

}

}

-> хотя это было принято, но для больших чисел он отображал "ограничение по времени
превышение".

Patrice T

Воспользуйся Улучшить вопрос чтобы обновить ваш вопрос.
Чтобы каждый мог обратить внимание на эту информацию.