硬币 - 文件阅读方法中的SPOJ TLE

时间:2015-07-21 17:25:33

标签: c while-loop scanf eof

在没有地图帮助的情况下通过Memoization解决问题,由于阅读文件的方法,我得到了一个TLE,根据我的说法,情况并非如此。可能的原因是什么?

以下是给出AC的代码 - http://ideone.com/OX1XlD

在上面的代码中,对于扫描n,如果while(scanf("%lld",&n)!=EOF)

替换
         scanf("%lld",&n)
         while(n!=EOF){ do something

                scanf("%lld",&n);
          } 

同样给出了TLE。我无法弄清楚原因。

2 个答案:

答案 0 :(得分:1)

我没有在链接中检查您的代码,但是根据问题中的代码,如果是while(scanf("%lld",&n)!=EOF),则您需要检查scanf()本身的返回值。

OTOH,说

   scanf("%lld",&n)
     while(n!=EOF){

您正在检查n的值,这是完全不同的情况,如果scanf()失败,则为undefined behaviour,如果n是早先没有初始化。

正确和首选的方法感谢Weather Vane先生将检查scanf()中的项目数,例如

if (1 != scanf("%lld",&n))

或,

while ( 1 == scanf("%lld",&n))  //as in this case

EOF是一个极端情况,通常很少见。

答案 1 :(得分:0)

在回应OP最近的评论时,我建议他尝试这个。

#include <stdio.h>

int main(void) {
    long long int n;
    char instr[20];
    while (1 == scanf("%lld", &n)) {
        printf ("The entry was %lld\n", n);
    }
    printf("End of file\n");
    return 0;
}

SPOJ将通过从文件中输入输入来测试您的代码。我们说inp.txt

1
2
3
4

然后使用类似的东西(在Windows控制台的情况下)运行代码

coins <inp.txt

这给了我输出

The entry was 1
The entry was 2
The entry was 3
The entry was 4
End of file

如果这样做,并且您的程序仍然超出时间限制,您必须查看您的解决方案算法,因为SPOJ没有提供关于为什么您有TLE的线索。

当然,您提交的解决方案不得打印这些提示,因为输出将无法通过测试。