Я новичок в онлайн-судьях. Я решил проблему получения правильного вывода на моем ПК, но онлайн-судья прямо говорит неправильный ответ.

Вот проблема https://www.codechef.com/problems/HORSES

Этот вопрос касается только кратчайшей разницы между элементами массива.

Мое решение может быть неэффективным, но оно правильное.

Пожалуйста, помогите мне


Повар очень любит лошадей. Ему нравится наблюдать за их гонками. Как и ожидалось, у него есть конюшня, полная лошадей. По выходным он вместе со своими друзьями ходит в свою конюшню, чтобы посмотреть, как проходят скачки некоторых из этих лошадей. Шеф хочет, чтобы его друзья наслаждались гонкой, и поэтому он хочет, чтобы гонка была близкой. Это может произойти только в том случае, если лошади сопоставимы по навыкам, т.е. разница в навыках меньше.

В конюшне N лошадей. Мастерство лошади i представлено целым числом S [i]. Шеф-повар должен выбрать для забега 2 лошадей, чтобы разница в их навыках была минимальной. Таким образом, он сможет провести очень интересную гонку. Ваша задача - помочь ему в этом и сообщить о минимальной возможной разнице между двумя лошадьми в гонке.

Входные данные: Первая строка входного файла содержит единственное целое число T - количество тестовых примеров. Каждый тестовый пример начинается со строки, содержащей целое число N. Следующая строка содержит N целых чисел, разделенных пробелом, где i-е целое число - S [i].

Вы можете прочитать проблему здесь https://www.codechef.com/problems/HORSES

#include<stdio.h>
#include<limits.h>
int main(){
    int t,n,i,u,v;
    int min=INT_MAX;
    scanf("%d",&t);
    while(t>0){
        scanf("%d",&n);
        int *s=malloc(sizeof(int)*n);
        for(i=0;i<n;i++){
            scanf("%d",&s[i]);
        }
        for(i=0;i<n-1;i++){
            for(int j=i+1;j<n;j++){
                if(min>abs(s[i]-s[j]))
                    min=abs(s[i]-s[j]);

            }

        }
    printf("%d\n",min);
    t--;

   }
}
c
1
newby 5 Окт 2018 в 19:59

1 ответ

Лучший ответ

Я решил проблему получения правильного вывода на моем ПК, но онлайн-судья прямо говорит неправильный ответ.

Недостаточное тестирование. Код правильный для t ==1, но не для t > 1.


Код должен сбрасывать минимум для каждого тестового примера.

// int min=INT_MAX;
scanf("%d",&t);
while(t>0){
  int min = INT_MAX; // add

Есть и другие недостатки, но все вышеперечисленное является ключевым.
Надежный код:

  1. Проверьте возвращаемое значение scanf()

  2. Убедитесь, что malloc() успешно, а затем освободите его.

  3. Адресный потенциал; переполнение в abs(s[i]-s[j])

Также

  1. Подумайте о том, чтобы отложить объявление переменной до блока, который в этом нуждается. Если бы OP сделал это, вышеуказанная проблема не возникла бы.

  2. Форматируйте код более единообразно и используйте {} даже с однострочными блоками с for, if, ....

КПД

Сначала отсортируйте массив (qsort()), а затем пройдитесь по массиву, обращая внимание на разницу между элементами. О (п * lg (п))

1
chux - Reinstate Monica 5 Окт 2018 в 18:07