ACM 10038 Jolly Jumpers

时间:2012-10-24 08:14:55

标签: c

我已经编写了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;
}

但是结果是超出时间限制。为什么?如何修改代码以缩短运行时间?

3 个答案:

答案 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。