我是在线法官的新手。我解决了在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--;
}
}
答案 0 :(得分:1)
我解决了在PC上获得正确输出的问题,但是在线法官直接说出了错误的答案。
测试不足。 t ==1
时代码正确,但t > 1
时代码不正确。
代码需要重置每个测试用例的最小值。
// int min=INT_MAX;
scanf("%d",&t);
while(t>0){
int min = INT_MAX; // add
也存在其他缺点,但这是关键。
健壮的代码将:
检查scanf()
检查malloc()
是否成功,然后再释放它。
地址电位; abs(s[i]-s[j])
也
考虑将变量声明延迟到需要它的块。如果OP做到了这一点,则不会发生上述问题。
更统一地设置代码格式,甚至对带有{}
的单行块也使用for, if, ...
。
效率
先对数组排序(qsort()
),然后遍历数组,注意元素之间的差异。 O(n * lg(n))