为啥本地编译都可以通过,但是到了测试全是TLE

P1319 压缩技术

Jpeng @ 2021-12-12 10:11:19


#include<stdio.h>
int main() {
    int N;
    scanf("%d", &N);
    int A[200][200];
    int B[1000];
    int x = 0;
    int s = 0;
    int j = 0, i = 0;
    int a = 0, b = 0;
    do {
        scanf("%d", &B[x]);
        x++;
    } while (getchar() != '\n');
    while (s != x) {
        if (s % 2 == 0) {
            for (i = 0; i < B[s]; i++) {
                A[a][b] = 0;
                b++;
                if (b == N) {
                    a++;
                    b = 0;
                }
            }
            s++;
        }
        else {
            for (i=0; i < B[s]; i++) {
                A[a][b] = 1;
                b++;
                if (b == N) {
                    a++;
                    b = 0;
                }
            }
            s++;
        }
    }
    for (int i = 0; i < N; i++) {
        for (int j = 0; j < N; j++) {
            printf("%d", A[i][j]);
        }
        printf("\n");
    }
}

by ssytxy2024 @ 2021-12-12 10:21:40

编译通过和TLE有关系吗?

TLE是指你的程序运行太久了


by Jpeng @ 2021-12-12 10:36:31

@H2OCLNA 可是我在本地编译时候都不需要等待回车完之后就直接输出结果了,不知道是不是我这个判断输入是否结束这里在测试机上面一直没有结束


by Terrible @ 2021-12-12 10:36:54

@Jpeng 文件末尾不一定有'\n'。


by Jpeng @ 2021-12-12 10:38:07

@Terrible 可是那我应该怎么判断输入结束呢


by Terrible @ 2021-12-12 10:41:10

如果scanf和getchar读到文件末尾,会返回EOF=-1。

控制台输入需要最后加入Ctrl+Z,标志输入结束。


by Terrible @ 2021-12-12 10:45:07

while (getchar() != EOF);

可以看看下面的代码:

#include<stdio.h>
int a[1000];
int main()
{
    int n=0,i;
    while(scanf("%d",&a[n])!=EOF)n++;
    for(i=0;i<n;i++)printf("%d ",a[i]);
}

输入:

1 2 3 4
5 6 738 3
2

54
^Z

输出:

1 2 3 4 5 6 738 3 2 54

by Terrible @ 2021-12-12 10:47:08

^ZCtrl+Z所显示的内容。

也可以看看下面的博客(当然是随便找的)

https://blog.csdn.net/Sinsinw/article/details/81057700


by Terrible @ 2021-12-12 10:49:41

实际上你也可以通过最开始输入的N来判断数据是否输入完毕。

如果后面输入的数据加和等于N*N那么就跳出读入的循环。


by Jpeng @ 2021-12-12 11:10:56

@Terrible 谢谢大佬!!!已经AC了哈哈哈


|