使用fflush加速代码以防止超出时间限制

如果标准输出未刷新,以下代码将获得 TLE(超出时间限制)。

#include<stdio.h>
int main(){
    int a;
    while(1){
        scanf("%d",&a);
        printf("%dn",a);
        fflush(stdout);
        if(a==42)
            break;
    }
    return 0;
}

刷新输出缓冲区如何帮助克服 TLE?
这是问题链接 - https://www.spoj.com/problems/EXPECT/

回答

问题说明告诉你该怎么做:

注意:程序在打印每一行后应清除输出缓冲区。

可以使用 fflush(stdout) 命令或在执行开始时设置适当的缓冲类型 - setlinebuf(stdout) 来完成。

问题标题说明了原因:

(交互的)

评判软件以交互方式运行程序。在给程序一个输入之后,它在提供更多输入之前等待输出。当您的程序不刷新缓冲输出时,判断软件会一直等待,直到超过其时间限制。

通常,终端的输出流是行缓冲的,在这种情况下,打印换行符会导致它们被刷新。但是,这个判断软件很可能使用了一个完全缓冲的管道,因此在缓冲区满或您明确请求刷新(或者,在程序开始时,您将缓冲模式更改为无缓冲或行缓冲)。

当您刷新输出时,判断软件会看到它,然后它会继续并提供更多输入。

作为在 each 之后刷新输出的替代方法printf,您可以通过setvbuf(stdout, NULL, _IOLBF, 0);在程序开始时执行(在对流执行任何其他操作之前)将流设置为行缓冲模式。

  • @AkashDahane: You can see the size of the buffer by running this program: `#include <stdio.h>` / `int main(void) { for (int i = 0; i < 16384; ++i) { fprintf(stderr, "%dn", i); putchar('*'); } }`. It writes one character at a time to `stdout`, after writing how many bytes it has written so far to `stderr`. Since the `stderr` output includes `n`, it will be flushed in each call. When the `stdout` buffer is full, it will be flushed and will appear immediately after the number of bytes that have been written to it. That number is the size of the buffer.

以上是使用fflush加速代码以防止超出时间限制的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>