- 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
http://ideone.com/DdFJfL
Амаяк Арутюнович, а Вы нам основы функционального программирования на Си покажете?
Помню, у меня уже некогда было кобенаторно-функциональное обострение: http://govnokod.ru/13420#comment188342
И да, это не C++.
> exit
http://cs410416.vk.me/v410416505/abb6/53ARIQmZ4SU.jpg
y rplc''-_'',LF,'' '' - вырезаем переносы строки и меняем минусы на _
n=.{.a=.0" - считываем массив a из строки и выделяем количество чисел n
t=.<:+: - ищем количество диагоналей матрицы n x n
(<.-:t)~:i. - ищем какую диагональ удалить
(</.|.*/~}.a) - создаем матрицу произведений, разворачиваем и нарезаем на диагонали
#~ - выбираем только нужные диагонали
<./; - распаковываем диагонали в массив и ищем наименьшее произведение
LF,~": - превращаем в строку и добавляем перенос строки
По памяти эта параша не пройдет
И случайно нашёл линейный алгоритм для проблемы коммивояжёра
2. в примере вывод должен быть -9, разве нет?
3. с последовательностью только из положительных чисел тоже не сработает, я правильно понял?
3 - Сработает, ошибка в сохранении мин значений для последующего умножения (обнаружил только после отправки задания)
это тебе поцоны во дворе сказали ?
>>PHP
а, ну все с тобой понятно
>>AppleScript
это говорит человек у которого "паскаль устарел"?
Например байтстринги неявно кастуются в юникод. И это очень плачевно заканчивается.
Если бы у второго питона была настоящая сильная типизация, то изначальный автор не забыл бы decode(). И мне не пришлось бы туда его дописывать самому.
> однобайтовую кодировку
utf-8 - однобайтовая? Байтстринги в utf-8 тоже как бы крашатся на касте в юникод (но только если содержат что-то кроме ascii, что усугубляет проблему).
Мечтать не вредно... Всякие gevent'ы не хотели идти натретийпитон в те дни.
А для новых проектов?
Эм, что-то я не врубаюсь, можно пример?
- забываешь сделать decode
- складываешь его с юникодной строкой
- кровь-кишки-ascii-codec-can't-decode-byte-0xd1-in-position-0
Причём символы из ascii кастуются без проблем, заметая проблему под ковёр до поры до времени.