include stdio include stdlib include math define DBL_EPSILON 220446049

 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
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define DBL_EPSILON 2.2204460492503131E-16 //машинный эпсилон для double
int main(int argc, char **argv)
{
int n, i,right=0,left=0,NowLeft=0;
double res=-1000.0,Eres=0; //Eres=∑res от left до right
scanf("%d", &n);
n*=2;
int *input;
input = (int*)malloc(sizeof(long) * n);
for(i = 0; i < n; i++,i++)
{
scanf("%ld/%ld", &input[i],&input[i+1] ); //считывание входных данных
}
for (i = 0;i < n; i+=2)
{
Eres=Eres + log10((double)input[i]/(double)input[i+1]); //т.к. log(10)n+log(10)l=log(10)(n*l),наиб произв дробей при наиб значении ∑log
if ((Eres>res+DBL_EPSILON) || ((Eres==res) && (left>NowLeft))) //Машинный ноль предотвращает несвоевременный вход по условию
{
right=i/2; //если находим последовательность с бОльшим значением log,запоминаем правую и левую границу этой последовательности
res=Eres;
left=NowLeft;
}
if (Eres<=0) //как только сумма логарифмов становится равной отрицательному числу,дальнейшее вычисление с постоянным "баластом" теряет смысл,продолжаем искать максимальный log уже c n-ой дроби
{
Eres=0;
NowLeft=i/2+1;
}
}
printf("%d %d\n" , left,right);
free(input);
return 0;
}