Тест-кейс, где этот код терпит неудачу?
Страница Конкурса | CodeChef[^]
Хотя код выглядит огромным, но идея довольно проста.
Никто не знает, но в саду шеф-повара живут N лягушек.
Теперь они сидят на оси Х и хотят поговорить друг с другом. Одна лягушка может послать сообщение другой, если расстояние между ними меньше или равно К.
Шеф-повар знает все P пар лягушек, которые хотят отправлять сообщения. Помогите ему определить, могут они или нет!
Примечание : более 1 лягушки могут находиться в одной и той же точке на оси X.
Ввод
Первая строка содержит три целых числа N, K и P.
Вторая строка содержит N целых чисел через пробел A1, A2, ..., AN, обозначающих x-координаты лягушек".
Каждая из следующих P строк содержит два целых числа A и B, обозначающих количество лягушек в соответствии с входными данными.
Выход
Для каждой пары выведите "да" без скобок, если лягушки могут говорить, и "нет", если они не могут.
Ограничения
1 ≤ N, P ≤ 10^5
0 ≤ Ai, K ≤ 10^9
1 ≤ A, B ≤ N
##Извините, если код не эффективен, я любитель в программировании, и я улучшу iA.
Что я уже пробовал:
#include<stdio.h> #include<stdlib.h> int main() { long int counter, d, w, flag, temp, q, y, t, N, K, P, *e, *f, A, B, i, j; scanf("%ld%ld%ld",&N,&K,&P); e=(long int*)malloc(N*sizeof(long int)); f=(long int*)malloc(N*sizeof(long int)); counter=0; //so that the array is sorted only once i.e for i=0 for(i = 0; i < N; i++ ) { scanf("%ld", e+i ); *( f + i ) = *( e + i ); } for( t = 0; t < P; t++ ) { scanf( "%ld%ld",&A, &B ); w= *( f + A - 1 ); //contains the coordinate of x at Ath position q= *( f + B - 1 ); //contains the coordinate of x at Bth position if( abs( w - q ) <= K ) printf("Yes\n"); else { d = ( w < q ) ? w : q; //d contains greater of the two coordinates if( counter == 0 ) { for( i = 0; i < n; i++ ) //sorting only for c=0 { for( j = 0; j < n-1; j++ ) { if( *( e + j ) > *( e + j + 1 ) ) { temp = *( e + j ); *( e + j ) = *( e + j + 1 ); *( e + j + 1 ) = temp; } } } } for( i = 0; i < N; i++ ) { if( *( e + i ) == d ) break; } flag=0; while(1) { if( ( *(e+i+1) - *(e+i) ) > K ) { flag=1; break; } if( i == N-1 || (*( e + i + 1 )) == q ) { break; } i++; } if( flag == 0 ) printf("Yes\n"); else printf("No\n"); counter++; } } return 0; }
Richard MacCutchan
В чем вопрос (кроме того, кто пишет такой ужасный код)?
Richard MacCutchan
Я бы попытался помочь, если бы вы объяснили свою проблему, но так как вы этого не сделали, я не смог догадаться, в чем она заключалась. И этот код практически невозможно понять, со всеми этими однобуквенными именами переменных, которые ничего не значат.
Rick York
Нет, этот вопрос не упоминается выше. На самом деле, в вашем посте вообще нет никаких вопросов. Существует формулировка проблемы, которую вы пытаетесь решить, и ваша попытка решения. Итак, еще раз, в чем заключается ваш вопрос? Позвольте мне быть упреждающим в одном-если вы спрашиваете: "почему это не работает?" Я не знаю. Запустите отладчик и выясните это. Это то, что вы должны сделать, и вы не можете ожидать, что кто-то другой поймет это за вас. И еще одна вещь: когда большинство переменных названы одной буквой, любому гораздо труднее понять, что происходит.
Rick York
Еще один комментарий - Мне легче следовать ему, когда я использую нотацию индекса массива вместо разыменования указателей. Например, во внутренней части вашего цикла получение значений может быть записано следующим образом :
scanf( "%ld", &e[i] );
f[i] = e[i];
а первые задания w и q можно записать в виде :
w = f[A-1];
q = f[B-1];
Я думаю, что это гораздо более интуитивно и легко.
Rick York
Я заметил еще одну вещь - у вас есть scanf, который ищет два целых числа и передает ему строку формата "%ld%ld". Правильно ли это работает? У меня такое чувство, что этого не произойдет, потому что что будет разграничивать ценности? Я бы поставил пробел или запятую между ними в этой строке формата - "%ld %d". Я спрашиваю, потому что уже очень давно не писал консольной программы, которая запрашивала бы ввод.