Задача
Весна… Прекрасное время! Все, казалось бы оживает и двигается, расцветает, начинается новый проход цикла жизни. И общеизвестный Мурзик не является исключением! Но если он чрезвычайно активен днем – то точно так же крепко спит ночью. Причем несчастный хищник видит преимущественно кошмары…
Одной ночью ему приснилось, что он судья на математических соревнованиях крыс (да, в наш век цифровых технологий даже крысы не остаются за гранью научно-технического прогресса). Соревнования проводятся среди [latex]N[/latex] команд по [latex]K[/latex] крыс в каждой. Соревнования проводятся в [latex]К[/latex] раундов, в каждом из которых представитель команды называет число. Побеждает та команда, у которой произведение всех чисел наибольшее. Почему крысы не называют каждый раз максимально возможное число? На то они и крысы, что в отличии от Мурзика, обделены интеллектом. Но и Мурзик понимает, что сам подсчитать результат не сможет из-за недостачи математических способностей и поэтому просит вашей помощи.
Входные данные
Первая строка содержит два целых числа [latex]N[/latex] и [latex]K[/latex] [latex](0 < N ≤ 20, 0 < K ≤ 100000)[/latex]. Следующие [latex]K[/latex] строк содержат по N чисел, которые называют представители команд. Причем крысы, как представители образованного вида, знают только 32-битовые знаковые числа.
Выходные данные
Номер команды, выигравшей соревнования. Если несколько команд имеют одинаковые результаты, то побеждает та, у которой больше номер.
Тесты
| # | Входные данные | Выходные данные | 
|---|---|---|
| 1 | 3 3 20 10 30 15 20 20 30 30 20 | 3 | 
| 2 | 3 3 20 -10 -30 15 25 20 30 -30 20 | 1 | 
| 1 | 3 3 0 -10 -30 15 25 20 30 -30 20 | 2 | 
Код программы
| 1 2 3 4 5 6 7 8 9 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 | #include <iostream> #include <cmath> #include <climits> using namespace std; double INF = 1e18; int sgn(long long a){     if(a < 0) return -1;     else if(a == 0) return 0;     else return 1; } struct logNumber{     long long sign;     double value;     logNumber(int sign = 1, double value = 0){         this->sign = sign;         this->value = value;     }     void operator *= (long long a){         sign *= sgn(a);         if(sign == 0) value = 0;         else value += log(abs(a));     }     bool operator >(logNumber a){         return (sign > a.sign) or  (sign == 1 and a.sign == 1 and value > a.value) or (sign == -1 and a.sign == -1 and value < a.value);     }     bool operator ==(logNumber a){         return sign == a.sign and value == a.value;     } }; int main() {     cin.tie(NULL);     ios_base::sync_with_stdio(false);     int n,k;     cin>>n>>k;     logNumber mult[n];     for(int i =0; i < k; i++){         for(int j=0; j < n; j++){             long long temp;             cin>>temp;             mult[j] *= temp;         }     }     logNumber maxMult = mult[0];     int maxTeam = 0;     for(int i = 0; i < n; i++){         if (mult[i] > maxMult){             maxMult = mult[i];             maxTeam = i;         }         else if(mult[i]==maxMult){             maxTeam = max(i, maxTeam);         }     }     cout << maxTeam + 1;     return 0; } | 
Решение задачи
Произведение результатов крыс может быть очень большим числом. Поэтому можно сравнивать их по знаку, если же по знаку они равны, то можно сравнивать не сами числа, а логарифмы от чисел. Создаем структуру, которая реализует эту идею.
Ссылки
Ссылка на e-olymp
Ссылка на ideone
