【问题标题】:COINS - SPOJ TLE in File reading MethodCOINS - 文件读取方法中的 SPOJ TLE
【发布时间】:2015-07-21 17:25:33
【问题描述】:

在没有 Maps 帮助的情况下通过 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。我不知道为什么。

【问题讨论】:

  • “地图”是什么意思?什么是 TLE?你不应该到处使用不知道的缩写。如果问题不需要,请不要包括 - TMI。
  • @Olaf 只是添加先生,KKDPMAP 和 CMVK。 :-)
  • TLE:超过时间限制
  • @SouravGhosh:WTF AKüFi? :-)
  • @SouravGhosh:哈哈! “AKüFi”实际上是德语:字面意思是“缩写狂热”(嗯,我总是努力提高我的语言技能)

标签: c while-loop scanf eof


【解决方案1】:

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

OTOH,通过说

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

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

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

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

或者,

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

EOF 是一种特殊情况,通常很少见。

【讨论】:

  • @Olaf 仍然承认先生。 while(scanf("%lld",&n)!=EOF) 正在检查返回值,对吧?
  • 我的错!我确实过度阅读了第一个 sn-p 并与 OPs 修改混淆(可能是因为“你是”,因为他没有使用那个,但修改后的版本。再次抱歉!
  • 我建议你指出正确的方法:while (1 != scanf(...))。值 EOF 仅由 scanf 返回,如果你给它一个 NULL 格式的指针。
  • @WeatherVane:那么while ( scanf(...) == 1 ) 不是正确的方式吗?最好的,当然是区分 EOF!= 1
  • @WeatherVane 已请求审核先生。
【解决方案2】:

针对 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 的任何线索。

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

【讨论】:

    猜你喜欢
    • 2016-11-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-20
    • 2012-04-13
    • 1970-01-01
    相关资源
    最近更新 更多