我已经编写了Jolly Jump problem(ACM 10038 uva)的解决方案代码。 我的守则如下:
#include<stdio.h>
#include<stdlib.h>
int main(){
int count=0;
int Number[3000]={0};
int Absolute[3000]={0};
bool flag=true;
while(scanf("%d",&count)){
for(int i=0;i<count;++i){
scanf("%d",&Number[i]);
Absolute[i]=0;
}
for(int j=0;j<count-1;++j){
int diff=Number[j]-Number[j+1];
if(diff<0)diff*=-1;
Absolute[diff]=1;
}
flag=true;
for(int x=1;x<count;++x){
if(Absolute[x]!=1){
flag=false;
break;
}
}
if(flag)printf("Jolly\n");
else printf("Not Jolly\n");
}
return 0;
}
但是结果是超出时间限制。为什么?如何修改代码以缩短运行时间?
答案 0 :(得分:2)
您的计划可能超过了时间限制,因为它永远不会完成。如果/ scanf()
返回EOF
,则以下内容永远不会停止循环:
while(scanf("%d",&count)){
// whatever...
}
在这些在线编程问题中,通常最好至少针对问题中提供的示例数据运行您提出的解决方案,看看您是否获得了预期的输出。如果你的程序没有产生预期的输出,那么你知道你有一个问题要修复(你有一些具体的调试)。
答案 1 :(得分:1)
无限循环!只需将while(scanf("%d",&count))
替换为while(scanf("%d",&count) != EOF)
即可。
来自man scanf
:
返回值
These functions return the number of input items successfully matched and assigned, which can be fewer than provided for, or even zero in the event of an early matching failure. The value EOF is returned if the end of input is reached before either the first successful conversion or a matching failure occurs. EOF is also returned if a read error occurs, in which case the error indicator for the stream (see ferror(3)) is set, and errno is set indicate the error.
我也是竞争对手。我可以给你的一个提示是始终创建一个输入文件(in.txt)和一个输出文件(out.txt),将输入重定向到程序并使用diff
比较输出:
$ cat in.txt
4 1 4 2 3
5 1 4 2 -1 6
$ cat out.txt
Jolly
Not jolly
$ ./jolly_jumpers < in.txt > my_out.txt
$ diff -s out.txt my_out.txt
Files out.txt and my_out.txt are identical
答案 2 :(得分:0)
我之前已经回答过了。
我所做的是将每两个元素的差异添加到一个向量中,最后对它进行排序。
现在你需要做的就是检查这个向量的每个元素是否比前一个元素多1个。另外,将此有序向量的第一个元素检查为1,将最后一个元素检查为n-1。