数组元素之间的最短差异

时间:2018-10-05 16:59:45

标签: c

我是在线法官的新手。我解决了在PC上获得正确输出的问题,但是在线法官直接说出了错误的答案。

这是问题https://www.codechef.com/problems/HORSES

此问题仅处理数组元素之间的最短差异。

我的解决方案可能无效,但它是正确的。

请帮助我


厨师非常喜欢马。他喜欢看他们的比赛。不出所料,他的马stable稳定。他和他的朋友们在周末去他的马stable看一些这类的赛马。厨师希望他的朋友们喜欢比赛,所以他希望比赛结束。只有在马匹的技术水平相近时,也就是这种情况下,这种情况才会发生。

马the里有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--;

   }
}

1 个答案:

答案 0 :(得分:1)

  

我解决了在PC上获得正确输出的问题,但是在线法官直接说出了错误的答案。

测试不足。 t ==1时代码正确,但t > 1时代码不正确。


代码需要重置每个测试用例的最小值。

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

也存在其他缺点,但这是关键。
健壮的代码将:

  1. 检查scanf()

  2. 的返回值
  3. 检查malloc()是否成功,然后再释放它。

  4. 地址电位; abs(s[i]-s[j])

  5. 中溢出

  1. 考虑将变量声明延迟到需要它的块。如果OP做到了这一点,则不会发生上述问题。

  2. 更统一地设置代码格式,甚至对带有{}的单行块也使用for, if, ...

效率

先对数组排序(qsort()),然后遍历数组,注意元素之间的差异。 O(n * lg(n))