- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
- 67
- 68
- 69
- 70
- 71
- 72
- 73
- 74
- 75
- 76
- 77
- 78
- 79
- 80
- 81
- 82
- 83
- 84
- 85
- 86
- 87
- 88
- 89
- 90
- 91
- 92
- 93
- 94
- 95
- 96
- 97
- 98
- 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