1. Список говнокодов пользователя b1nary

    Всего: 1

  2. Си / Говнокод #18924

    −11

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    33. 33
    34. 34
    35. 35
    36. 36
    37. 37
    38. 38
    39. 39
    40. 40
    41. 41
    42. 42
    43. 43
    44. 44
    45. 45
    46. 46
    47. 47
    48. 48
    49. 49
    50. 50
    51. 51
    52. 52
    53. 53
    54. 54
    55. 55
    56. 56
    57. 57
    58. 58
    59. 59
    60. 60
    61. 61
    62. 62
    63. 63
    64. 64
    65. 65
    66. 66
    67. 67
    68. 68
    69. 69
    70. 70
    71. 71
    72. 72
    73. 73
    74. 74
    75. 75
    76. 76
    77. 77
    78. 78
    79. 79
    80. 80
    81. 81
    82. 82
    83. 83
    84. 84
    85. 85
    86. 86
    87. 87
    88. 88
    89. 89
    90. 90
    91. 91
    92. 92
    93. 93
    94. 94
    95. 95
    96. 96
    97. 97
    98. 98
    99. 99
    #define MIN(a, b) ( ( (a) < (b) ) ? (a) : (b) )
    // Libraries
    #include <stdio.h>
    #include <stdlib.h>
    // Check Int32.max
    #ifndef INT32_MAX
        // Define Int32.max
        #define INT32_MAX ((long long)0xFFFFFFFE)
    #endif
    // Минимальное произведение
    long long fifthTask() { // ОСТОРОЖНО: ГОВНОКОД
        unsigned int i;//`for` loop counter
        unsigned int count;//count of elements
        long long*numbers;//elements
        //result value
        long long min;
        {//input values and do some 'on-the-go' calculations
            unsigned char containsZero = 0; //zero flag
            //pair1
            long long in_min_s  = 0; //минимальное отрицательное для перемножения на максимальное полож.
            long long in_max_u  = 0; //максимальное положительное для перемножения на минимальное отриц.
            //pair2
            long long in_min1_u = INT32_MAX - 1; //первое минимальное положительное для перемножения на второе и странений.
            long long in_min2_u = INT32_MAX;     //второе минимальное положительное для перемножения на первое и странений.
            //scan for count
            scanf("%u", &count);//2<=count<=10ˆ5
            //allocate numbers memory
            numbers = calloc(sizeof(long long), count);
            //scan 2 first min-max vals
            scanf("%lld", numbers+0);
            scanf("%lld", numbers+1);
            {//analyze first 2 inputed values manually
                if (*numbers == 0 || numbers[1] == 0){//set contains zero flag is input == 0
                    containsZero = 1;
                }
                if (*numbers < 0 || numbers[1] < 0){//get min signed val
                    in_min_s = MIN(*numbers, numbers[1]);
                }
                if (*numbers > 0) {//input min max unsigned vals step1
                    in_min1_u = *numbers;
                    in_min2_u = *numbers;
                    in_max_u  = *numbers;
                }
                if (numbers[1] > 0)
                {//input min max unsigned vals step2
                    if (*numbers < numbers[1]){in_min2_u = numbers[1];in_max_u  = numbers[1];}
                    else {in_min2_u = in_min1_u;in_max_u  = in_min2_u;in_min1_u = numbers[1];}
                }
            }
            for (i = 2; i < count; ++i)
            {//loop for all other vals
                //scan inputed val.
                scanf("%lld", numbers+i);
                //get inputed val.
                long long num = numbers[i];
                if (num == 0) {//set contains zero flag
                    containsZero = 1;
                }
                if (num < 0 && num < in_min_s) {//set min signed val (val < 0).
                    in_min_s = num;
                }
                if (num > 0) {
                    if(num < in_min1_u) {//swap 2 min vals and 1st min val = num
                        in_min2_u = in_min1_u;
                        in_min1_u = num;
                    }
                    else if (num>0&&num<in_min2_u) {//swap ('max') 2nd min val with `num`
                        in_min2_u = num;
                    }
                    if (num > in_max_u) {//set max unsigned val.
                        in_max_u = num;
                    }
                }
            }
            //ну и редкостный говнокод же я написал....
            //и..кажется..он работает(?)..лан, для олимпиады сойдет :]
            {//calc min
                //а вот и возможные рез-ты подъехали
                long long min1 = in_min_s  * in_max_u;
                long long min2 = in_min1_u * in_min2_u;
                if (in_min_s == 0) {//nooo..stupid user,dont enter those stupid vals again...
                    //дабы неверные рез-ты не вылезли в лог делаем их максимально возможными.
                    min1 = INT32_MAX;//kostyl
                }
                //get min multipl.
                min = MIN(min1, min2);
                if (containsZero && min > 0) {//0 * val if seq contains zero and zero < min.
                    min = 0;
                }
            }
        }
        return min; //return result
    }
    // Main function that runs preconfigured task
    int main(int argc, const char * argv[]) {
        long long res = fifthTask();
        printf("%lld", res);
        return 0;
    }

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

    Тест задачи отличается от написанного мною ниже, но суть такая же.
    Всероссийская олимпиада по информатике 2015-2016.
    Задача 5 - Минимальное произведение: Дана последовательность из N целых чисел (они могут быть положительными, отрицательными или равными 0). Нужно выбрать из них такую пару чисел, что их произведение друг на друга является минимальным среди всех других пар. (квадраты 1-ого числа не рассматриваются, но можно выбрать 2 одинаковых числа из последовательности).
    Также 1<N<10^5+1
    Вход:
    N - Колич-во чисел в последовательность
    Следующие N сток содержат сами числа, по модулю не превосходящие 40000

    Выход:
    Единственное число - наименьшее возможное произведение 2-х различных (по индексу в последовательности, как я понял) элементов этой последовательности.

    Пример:
    IN:
    3
    1
    -3
    2
    OUT:
    -6

    b1nary, 28 Октября 2015

    Комментарии (62)