#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
instdint.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.