Ошибка исполнения задачи [закрыт]

140
20 ноября 2019, 19:50

Выдает ошибку исполнения задачи. У меня на компиляторе все результаты тестов совпадают, а система выдает "ошибка исполнения".

Есть массив состоящий из n целых чисел a1, a2, ..., an. Массив a имеет одно специальное свойство:

a[i] = ( a[i-1] + 1) % m, для каждого i (1 < i ≤ n).

Дан массив a с несколькими потерянными элементами из него, каждый потерянный элемент заменяется на -1.

Вводные данные: Первая строка содержит целое число T, где T - количество тестов. Первая строка каждого теста содержит два целых числа n и m (1 ≤ n ≤ 1000) (1 ≤ m ≤ 10^9), где n - размер массива, а m - описанный модуль в формулировке задачи.

Вторая строка каждого теста содержит n целых чисел a1, a2, ..., an (- 1 ≤ ai < m), что дает массив a. Если i-й элемент потерян, то ai будет -1. В противном случае ai будет неотрицательным целым числом меньше m.

Гарантируется, что ввод правильный, и в данном массиве есть хотя бы один не потерянный элемент.

Вывод: Для каждого теста выведите одну строку, содержащую n целых чисел a1, a2, ..., an, массив a после нахождения всех потерянных элементов. Гарантируется, что ответ существует.

Примеры Ввода/Вывода:

+------------------+-------------------+
| стандартный ввод | стандартный вывод |
+------------------+-------------------+
| 4                | 1 2 3 4 5         |
| 5 10             | 7 8 9 0           |
| 1 2 3 4 5        | 5 6 0 1 2 3       |
| 4 10             | 5 6 7 8 9 0       |
| 7 -1 9 -1        |                   |
| 6 7              |                   |
| 5 -1 -1 1 2 3    |                   |
| 6 10             |                   |
| 5 -1 7 -1 9 0    |                   |
+------------------+-------------------+

Я решил считать все элементы, после в двойном цикле находить неравные -1 и поочередно их менять. В теории все выглядит просто, но падает с "ошибкой исполнения". Вот мое решение:

#include <cstdio>
#include <iostream>
using namespace std;
int main()
{
    ios_base::sync_with_stdio(0);
    int t;
    scanf("%d", &t);
    for( int q = 0; q < t; q++ )
    {
        int n, m;
        scanf("%d", &n);
        scanf("%d", &m);
        int a[m];
        for( int i = 0; i < n; i++ )
        {
            scanf("%d", &a[i]);
        }
        for( int g = 0; g < n; g++)
        {
            for( int i = 0; i < n; i++ )
            {
                if( a[i] == -1 && a[i+1] != -1 && i != n-1 )
                {
                    a[i] = (a[i+1] - 1) % m;
                }
                if( a[i-1] != -1 && a[i] == -1 && i != 0 )
                {
                    a[i] = (a[i-1] + 1) % m;
                }
                if( a[i] == 0 && a[i-1] == -1 )
                {
                    a[i-1] = m-1;
                }
            }
        }
        for( int i = 0; i < n; i++ )
        {
            printf("%d ", a[i]);
        }
        printf("\n");
    }
    return 0;
}
Answer 1
 if( a[i] == -1 && a[i+1] != -1 && i != n-1 )

эта строка явно неудачная - произойдёт обращение за пределы массива

считать все элементы, после в двойном цикле находить неравные -1

Разве недостаточно найти один нормальный элемент и восстановить весь массив в обе стороны от него? Ведь модуль задан.

READ ALSO
Как правильно описать бизнес процесс (ddd)?

Как правильно описать бизнес процесс (ddd)?

Есть бизнес, в котором пользователь, зарегистрировавшись (используя почту и пароль) может получить консультацию специалиста в неком чате

136
Плагин на C++ который запускает код на Java

Плагин на C++ который запускает код на Java

Есть известная игра CS:GO в которой можно хостить свои сервера и добавлять на них плагиныЭти плагины пишутся на C++ (plugin wiki), существует даже проект...

118
Сравнение ключей двух JSON

Сравнение ключей двух JSON

Прошу помочь с такой задачейИмеется json1, который является телом запроса к апи: {"key1":"value1","key2":"value2","key3":"value3"} и json2, являющийся телом ответа: {"key0":"value0","key1":"value1","key2":"value2","key3":"value3","key4":"value4"}

132
Установить фон кнопки [дубликат]

Установить фон кнопки [дубликат]

На данный вопрос уже ответили:

136