- 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
b1nary 28.10.2015 00:33 # 0
1024-- 28.10.2015 04:21 # +1
http://ideone.com/DdFJfL
1024-- 28.10.2015 04:53 # +1
1024-- 28.10.2015 07:04 # +4
kegdan 28.10.2015 07:30 # 0
1024-- 28.10.2015 07:40 # +2
1024-- 28.10.2015 07:51 # +3
1024-- 28.10.2015 07:59 # +1
1024-- 28.10.2015 08:14 # +7
gost 28.10.2015 18:35 # 0
3_dar 28.10.2015 21:27 # +2
3.14159265 28.10.2015 18:45 # +4
inkanus-gray 28.10.2015 18:49 # +1
Амаяк Арутюнович, а Вы нам основы функционального программирования на Си покажете?
1024-- 29.10.2015 01:03 # +3
Помню, у меня уже некогда было кобенаторно-функциональное обострение: http://govnokod.ru/13420#comment188342
b1nary 28.10.2015 23:19 # −2
b1nary 28.10.2015 23:20 # 0
gost 29.10.2015 08:28 # 0
И да, это не C++.
1024-- 29.10.2015 12:55 # 0
Abbath 29.10.2015 13:57 # +2
Abbath 29.10.2015 14:04 # +2
kegdan 29.10.2015 14:17 # +4
gost 29.10.2015 14:19 # 0
Abbath 29.10.2015 17:12 # 0
1024-- 29.10.2015 14:57 # +2
> exit
http://cs410416.vk.me/v410416505/abb6/53ARIQmZ4SU.jpg
gost 29.10.2015 15:08 # +3
Abbath 29.10.2015 17:21 # +1
y rplc''-_'',LF,'' '' - вырезаем переносы строки и меняем минусы на _
n=.{.a=.0" - считываем массив a из строки и выделяем количество чисел n
t=.<:+: - ищем количество диагоналей матрицы n x n
(<.-:t)~:i. - ищем какую диагональ удалить
(</.|.*/~}.a) - создаем матрицу произведений, разворачиваем и нарезаем на диагонали
#~ - выбираем только нужные диагонали
<./; - распаковываем диагонали в массив и ищем наименьшее произведение
LF,~": - превращаем в строку и добавляем перенос строки
По памяти эта параша не пройдет
gost 29.10.2015 17:44 # +1
Abbath 29.10.2015 17:45 # 0
Abbath 29.10.2015 18:01 # 0
Abbath 29.10.2015 18:16 # 0
TarasB 29.10.2015 16:38 # 0
Abbath 29.10.2015 16:50 # 0
TarasB 30.10.2015 12:08 # +5
roman-kashitsyn 30.10.2015 12:24 # +1
И случайно нашёл линейный алгоритм для проблемы коммивояжёра
TarasB 30.10.2015 12:26 # +1
inkanus-gray 30.10.2015 12:53 # 0
Abbath 29.10.2015 17:11 # +1
Abbath 29.10.2015 19:00 # +1
Antervis 28.10.2015 05:20 # +1
2. в примере вывод должен быть -9, разве нет?
3. с последовательностью только из положительных чисел тоже не сработает, я правильно понял?
Antervis 28.10.2015 06:38 # 0
b1nary 28.10.2015 22:56 # 0
3 - Сработает, ошибка в сохранении мин значений для последующего умножения (обнаружил только после отправки задания)
Vasiliy 30.10.2015 13:46 # +1
это тебе поцоны во дворе сказали ?
b1nary 30.10.2015 15:37 # −1
guest 31.10.2015 14:35 # +2
>>PHP
а, ну все с тобой понятно
>>AppleScript
это говорит человек у которого "паскаль устарел"?
bormand 31.10.2015 15:46 # +2
Например байтстринги неявно кастуются в юникод. И это очень плачевно заканчивается.
guest 31.10.2015 18:49 # +1
bormand 31.10.2015 19:19 # +2
Если бы у второго питона была настоящая сильная типизация, то изначальный автор не забыл бы decode(). И мне не пришлось бы туда его дописывать самому.
> однобайтовую кодировку
utf-8 - однобайтовая? Байтстринги в utf-8 тоже как бы крашатся на касте в юникод (но только если содержат что-то кроме ascii, что усугубляет проблему).
Stallman 31.10.2015 19:20 # +1
bormand 31.10.2015 19:21 # 0
Мечтать не вредно... Всякие gevent'ы не хотели идти натретийпитон в те дни.
inkanus-gray 31.10.2015 23:54 # 0
Stallman 31.10.2015 23:56 # +1
inkanus-gray 31.10.2015 23:57 # 0
А для новых проектов?
3_14dar 01.11.2015 01:36 # 0
3_14dar 01.11.2015 01:35 # 0
gost 31.10.2015 19:23 # 0
Эм, что-то я не врубаюсь, можно пример?
bormand 31.10.2015 19:29 # +1
- забываешь сделать decode
- складываешь его с юникодной строкой
- кровь-кишки-ascii-codec-can't-decode-byte-0xd1-in-position-0
Причём символы из ascii кастуются без проблем, заметая проблему под ковёр до поры до времени.
gost 31.10.2015 19:36 # 0
bormand 31.10.2015 19:38 # +1
gost 31.10.2015 19:40 # 0
bormand 31.10.2015 19:35 # 0
3_14dar 01.11.2015 01:37 # 0
Vasiliy 31.10.2015 15:31 # +4