2015-09-08 4 views
-2

Подробная информация о цели написания программы дается по ссылке: https://www.codechef.com/problems/COOKMACH/У меня есть предел Превышена ошибка в C. Как мне его преодолеть?

и ошибка

Ограничение по времени превысил

 Sub-Task Task #  Score Result (time) 

     1  0 NA  AC  (0.000000) 

     1  1 NA  TLE  (1.010000) 

     1  2 NA  TLE  (1.010000) 

     1  3 NA  TLE  (1.010000) 



     Final Score -> 0.000000 Result - TLE 

     2  4 NA  TLE  (1.010000) 

     2  5 NA  TLE  (1.010000) 

     2  6 NA  TLE  (1.010000) 

     7  NA  WA     (0.000000) 

Окончательный счет - 0,000000 Результат - TLE

код

#include <stdio.h> 
int main(void) 
{ 
    int test, set, des, a = 1, ctr = 0, str = 0, x; 
    scanf("%d", &test); 
    if (test > 0 && test <= 200) 
    { 
     for (x = 0; x < test; x++) 
     { 
      ctr = 0; 
      scanf("%d", &set); 
      scanf(" %d\n", &des); 
      if ((set > 0 && set <= 10000000) && (des > 0 && des <= 10000000)) 
      { 
       if (set <= 100 && des <= 100) 
       { 
        if (set == des) 
         ctr = 0; 
        if (set == 1) 
        { 
         while (set != des) 
         { 
          set = set * 2; 
          ctr++; 
         } 
        } 
        else if (set != 1) 
        { 
         if (des % 2 == 0) 
         { 
          while (a < des) 
          { 
           a = a * 2; 
           str++; 
          } 
         } 

         if (a == des || des == 1) 
         { 
          if (set < des) 
          { 
           if (set % 2 == 0) 
           { 
            while (set != des) 
            { 
             set = set * 2; 
             ctr++; 

            } 
           } 
           else if (set % 2 == 1) 
           { 
            set = (set - 1)/2; 
            ctr++; 
            while (set != des) 
            { 
             set = set * 2; 
             ctr++; 
            } 
           } 
          } 
          if (set > des) 
          { 

           if (set % 2 == 0) 
           { 

            while (set != des) 
            { 
             set = set/2; 
             ctr++; 

            } 
           } 
           else if (set % 2 == 1) 
           { 
            set = (set - 1)/2; 
            ctr++; 
            while (set != des) 
            { 
             set = set/2; 
             ctr++; 
            } 
           } 
          } 
         } 
        } 
       } 
       printf("%d\n", ctr); 
      } 
     } 
     return 0; 
    } 
} 
+3

«Как его преодолеть?» - Код быстрее. (Извините, этот ответ примерно так же полезен, как и вопрос, я знаю.) Отладка 101: код, ввод, ожидаемый результат, наблюдаемый вывод. Было бы неплохо, если бы какой-то смысл мог быть сделан из этого вопроса, не пройдя через внешнюю ссылку. Комментарии также не будут ошибочными. – DevSolar

+0

Некоторые из этих 'if' можно удалить, поскольку указано, что «_1 ≤ T ≤ 200, 1 ≤ A ≤ 107, 1 ≤ B ≤ 107_». Кроме того, 'scanf ("% d \ n ", &des);' -> 'scanf ("% d ", &des);' –

+0

Эй, глупая идея здесь: можете ли вы попробовать использовать scanf ("% d \ n", &test); для количество строк ввода. Возможно, ваша программа блокирует ожидание числа, когда он получает символ «\ n». Я думаю, что @CoolGuy прав: вам не нужно проверять ограничения, которые они больше похожи на контракт на входе чтобы помочь вам. –

ответ

0

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

#define swap(a, b) (a ^= b, b ^= a, a ^= b) 

int main() { 
    long a, b; 
    int count, T; 
    scanf("%d", &T); 
    while (T--) { 
     scanf("%ld%ld", &a, &b); 
     for (count = 0; a & (a - 1); a >>= 1) 
      ++count; 
     if (a > b) 
      swap(a, b); 
     for (; a < b; a <<= 1) 
      ++count; 
     printf("%d\n", count); 
    } 
    return 0; 
} 
+0

, пожалуйста, вы могли бы объяснить смещение битов и побитовое изменение целых чисел, как видите, я полный новичок. Просьба помочь –

+0

@PurviSampat Почему бы не прочитать его самостоятельно http://www.cprogramming.com/tutorial/bitwise_operators.html и https://graphics.stanford.edu/~seander/bithacks.html – Shreevardhan

+0

@PurviSampat: Умножения, делениями и модулями являются дорогостоящие операции. Битовый сдвиг влево совпадает с «* = 2». Смещение вправо совпадает с '/ = 2'. И '% 2 == 0' совпадает с проверкой того, установлен ли самый младший бит или нет (' & 1'). (Если он не установлен, число будет четным.) – DevSolar