COINS - 文件读取方法中的 SPOJ TLE

COINS - SPOJ TLE in File reading Method

在没有地图帮助的情况下通过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。我不明白为什么。

我没有检查您在 link 中的代码,但是从问题中的代码来看,在 while(scanf("%lld",&n)!=EOF) 的情况下,您正在检查 return 的值 scanf()本身。

OTOH,说

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

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

正确且首选的方法,感谢风向标先生将检查 scanf() 中的项目数量,例如

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

或者,

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

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

为了回应 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 的线索。

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