Информация об изменениях

Сообщение Re[2]: Задание из ЕГЭ по информатике от 15.08.2017 14:16

Изменено 15.08.2017 14:17 alexzzzz

Re[2]: Задание из ЕГЭ по информатике
Здравствуйте, watchmaker, Вы писали:

W>
int solve() {
W>    const int d = 8;
W>    int b[d] = {0};
W>    int n = get_next_int();
W>    int r = 0;
W>    int m = 0;
W>    for (int i = 0; i < n; ++i) {
W>        int& e = b[i % d];
W>        m = max(m, e);
W>        e = get_next_int();
W>        r = max(r, m * e);
W>    }
W>    return r;
W>}


Переписал на C# как смог:
  Скрытый текст
int Solve(IEnumerable<int> numbers)
{
    var enumerator = numbers.GetEnumerator();

    const int d = 8;
    int[] b = new int[d];
    int n = GetNextInt(enumerator);
    int r = 0;
    int m = 0;
    for (int i = 0; i < n; ++i)
    {
        ref int e = ref b[i % d];
        m = Math.Max(m, e);
        e = GetNextInt(enumerator);
        r = Math.Max(r, m * e);
    }
    return r;
}

private static int GetNextInt(IEnumerator<int> enumerator)
{
    enumerator.MoveNext();
    return enumerator.Current;
}
На исходной последовательности 10, 100, 45, 55, 245, 35, 25, 10, 10, 10, 26 всё отлично, результат = 2600.
На обратной последовательности 26, 10, 10, 10, 25, 35, 245, 55, 45, 100, 10 код падает (InvalidOperationException: Enumeration already finished)
На последовательности 2, 5, 2, 2, 2, 2, 2, 2, 2, 1 выдаёт 0, правильный ответ 5.

У кого косяк?

--
Мой вариант на C#

const int MIN_DISTANCE = 8;

int Solve(IEnumerable<int> numbers)
{
    int firstNumber = -1;
    int maxProduct = -1;
    var queue = new Queue<int>(MIN_DISTANCE + 1);

    foreach (int secondNumber in numbers)
    {
        queue.Enqueue(secondNumber);
        if (queue.Count <= MIN_DISTANCE)
        {
            continue;
        }

        firstNumber = Math.Max(firstNumber, queue.Dequeue());
        maxProduct = Math.Max(maxProduct, firstNumber * secondNumber);
    }

    return maxProduct;
}

На тех же последовательностях даёт 2600, 2600 и 5.
Re[2]: Задание из ЕГЭ по информатике
Здравствуйте, watchmaker, Вы писали:

W>
int solve() {
W>    const int d = 8;
W>    int b[d] = {0};
W>    int n = get_next_int();
W>    int r = 0;
W>    int m = 0;
W>    for (int i = 0; i < n; ++i) {
W>        int& e = b[i % d];
W>        m = max(m, e);
W>        e = get_next_int();
W>        r = max(r, m * e);
W>    }
W>    return r;
W>}


Переписал на C# как смог:
  Скрытый текст
int Solve(IEnumerable<int> numbers)
{
    var enumerator = numbers.GetEnumerator();

    const int d = 8;
    int[] b = new int[d];
    int n = GetNextInt(enumerator);
    int r = 0;
    int m = 0;
    for (int i = 0; i < n; ++i)
    {
        ref int e = ref b[i % d];
        m = Math.Max(m, e);
        e = GetNextInt(enumerator);
        r = Math.Max(r, m * e);
    }
    return r;
}

int GetNextInt(IEnumerator<int> enumerator)
{
    enumerator.MoveNext();
    return enumerator.Current;
}
На исходной последовательности 10, 100, 45, 55, 245, 35, 25, 10, 10, 10, 26 всё отлично, результат = 2600.
На обратной последовательности 26, 10, 10, 10, 25, 35, 245, 55, 45, 100, 10 код падает (InvalidOperationException: Enumeration already finished)
На последовательности 2, 5, 2, 2, 2, 2, 2, 2, 2, 1 выдаёт 0, правильный ответ 5.

У кого косяк?

--
Мой вариант на C#

const int MIN_DISTANCE = 8;

int Solve(IEnumerable<int> numbers)
{
    int firstNumber = -1;
    int maxProduct = -1;
    var queue = new Queue<int>(MIN_DISTANCE + 1);

    foreach (int secondNumber in numbers)
    {
        queue.Enqueue(secondNumber);
        if (queue.Count <= MIN_DISTANCE)
        {
            continue;
        }

        firstNumber = Math.Max(firstNumber, queue.Dequeue());
        maxProduct = Math.Max(maxProduct, firstNumber * secondNumber);
    }

    return maxProduct;
}

На тех же последовательностях даёт 2600, 2600 и 5.