Код на C работает нормально на ideone, но получает WA в spoj

#c

#c

Вопрос:

http://www.spoj.com/problems/MORENA / Получение WA в spoj, в противном случае работает нормально на ideone, для тестовых случаев. есть идеи? Ранее я писал это на java, получал NZEC. Тогда я написал это на C.

 #include<stdio.h>

int main(){

    int n,i;
    scanf("%d",amp;n);
    long num[n];
    for(i=0;i<n;i  ){
        scanf("%ld",amp;num[i]);
    }

    int flag;
    int l;
    for(l=0;l<n;l  ){
        if(num[l 1] > num[l]){
            flag = 1;
            break;
        }
        else if(num[l 1] < num[l]){
            flag = 0;
            break;
        }
    }
    int count = 1,k;

    for(k =0; k<n-1; k  ){
        if(flag){
            if (num[k 1] > num[k]){
                count  ;
                flag = 0;
            }
            else if(num[k 1]==num[k]){
                flag = 1;
            }
            else if(num[k 1]<num[k]){
                //count  ;
                flag=1;
            }
        }
        else{
            if(num[k 1] < num[k]){
                count  ;
                flag = 1;
            }
            else if(num[k 1]==num[k]){
                flag = 0;
            }
            else if(num[k 1]>num[k]){
                //count  ;
                flag = 0;
            }
        }
    }

    printf("%d",count);
    return 0;
}
  

Комментарии:

1. Не думайте, что все знают, что означают «WA» и «NZEC». Я, конечно, этого не делаю.

2. Мини-глоссарий SPOJ: SPOJ: Онлайн-судья Sphere (сайт для решения задач / головоломок / соревнований по программированию), WA: неправильный ответ, NZEC: ненулевой код выхода, TLE: превышен лимит времени

3. @MichaelBurr: Я предлагаю отредактировать это в вопросе.

4. IMO long не рекомендуется, поскольку он 32 бита в Windows и 64 бита в большинстве реализаций Linux / Unix. Стандарт C указывает только, что long имеет не менее 32 бит , и вы не можете знать, сколько long находится long в компиляторе судьи. Предположение, что это 64 бита, может привести к серьезным переполнениям. Если вам нужен 64-разрядный тип, вы должны использовать long long вместо него, который гарантированно будет не менее 64 бит, или использовать int64_t in stdint.h . Обратите внимание, что если бы я не читал комментарий Майкла Берра выше, я бы подумал, что WA предупреждает. Не думайте, что все знают, что вы сказали

Ответ №1:

Подождите, что, здесь МНОГО проблем. Вот несколько, сначала:

   int n,i;
  scanf("%d",amp;n);
  long num[n];
  

невозможно (или, по крайней мере, не должно быть возможным) объявить массив размером с определенную переменную, используйте malloc() для этого, выполнив это:

 long* num = malloc(sizeof(long)*n);
  

Другая проблема заключается в том, что вы пересекаете границу массива в первом цикле, что странно, потому что вы позаботились об этом во втором: P
Просто измените: for(l = 0 ; l < n ; l ) на for(l = 0 ; l < n-1 ; l ) , как в вашем операторе IF, вы используете элемент массива l 1, и когда l равно n-1, вы фактически тестируете n-1 элемент по сравнению с N-м элементом, который не находится на границе вашего массива.
В остальном код кажется нормальным.

Комментарии:

1. VLA доступен с C99, но вы должны явно указать --std=c99

2. Lu’u — я знаю, но в оригинале это неверно (хотя в моем компиляторе вам не нужно указывать —std=c99), и я не уверен, какой сайт что запускает…

3. Да, я имею в виду, что вы ничего не можете предположить, если не знаете точно компилятор и флаги компиляции. Лучше использовать только то, что гарантировано

Ответ №2:

Вопрос имеет сильные связи с конкурентным программированием. Обычно отображается проблема, и ожидается, что пользователь отправит код, который дает ожидаемый результат для тестируемого ввода для онлайн-судьи, и SPOJ является одним из них. И на самом деле есть образец ввода и образец вывода, отображающий почти все проблемы. Таким образом, ваш код будет выдавать тот же результат, что и в примере вывода для примера ввода проблемы в ideone, но ваш код тестируется на огромном количестве данных в онлайн-судье, и это приведет к NZEC.