一直ce的问题

P1255 数楼梯

Q9_KKK @ 2022-03-29 20:39:10

初始化方式1

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

char ans[5005][5005] = {"1", "1"};
int main()
{
    int n;
    scanf("%d", &n);

    for (int i = 2; i <= n; i++)
    {
        int lens1 = strlen(ans[i - 1]);
        int lens2 = strlen(ans[i - 2]);
        char ans1[1005] = "";
        char ans2[1005] = "";
        for (int j = 0; j < lens1; j++)
        {
            ans1[lens1 - j - 1] = ans[i - 1][j];
        }
        for (int j = 0; j < lens2; j++)
        {
            ans2[lens2 - j - 1] = ans[i - 2][j];
        }
        int lens = lens1 > lens2 ? lens1 : lens2;
        char ans_tmp[5005] = "";
        for (int j = 0; j < lens; j++)
        {
            if (ans1[j])
                ans_tmp[j] += ans1[j] - '0';
            if (ans2[j])
                ans_tmp[j] += ans2[j] - '0';
            ans_tmp[j] += '0';
            if (ans_tmp[j] > '9')
            {
                ans_tmp[j] -= 10;
                ans_tmp[j + 1] += 1;
            }
        }
        if (ans_tmp[lens])
        {
            ans_tmp[lens++] += '0';
        }
        for (int j = 0; j < lens; j++)
        {
            ans[i][lens - j - 1] = ans_tmp[j];
        }
    }
    printf("%s\n", ans[n]);
    return 0;
}
这么写一直报ce,但本地没问题

然后我乱改了下,变成下面的初始化方式

 #include <stdio.h>
#include <string.h>
#include <stdlib.h>

char ans[5005][5005];
int main()
{
    int n;
    scanf("%d", &n);
    ans[0][0] = '1';
    ans[1][0] = '1';
    for (int i = 2; i <= n; i++)
    {
        int lens1 = strlen(ans[i - 1]);
        int lens2 = strlen(ans[i - 2]);
        char ans1[2005] = "";
        char ans2[2005] = "";
        for (int j = 0; j < lens1; j++)
        {
            ans1[lens1 - j - 1] = ans[i - 1][j];
        }
        for (int j = 0; j < lens2; j++)
        {
            ans2[lens2 - j - 1] = ans[i - 2][j];
        }
        int lens = lens1 > lens2 ? lens1 : lens2;
        char ans_tmp[3005] = "";
        for (int j = 0; j < lens; j++)
        {
            if (ans1[j])
                ans_tmp[j] += ans1[j] - '0';
            if (ans2[j])
                ans_tmp[j] += ans2[j] - '0';
            ans_tmp[j] += '0';
            if (ans_tmp[j] > '9')
            {
                ans_tmp[j] -= 10;
                ans_tmp[j + 1] += 1;
            }
        }
        if (ans_tmp[lens])
        {
            ans_tmp[lens++] += '0';
        }
        for (int j = 0; j < lens; j++)
        {
            ans[i][lens - j - 1] = ans_tmp[j];
        }
    }
    printf("%s\n", ans[n]);
    return 0;
}

然后就过了,懵了,请求巨巨们帮蒟蒻解答一下


by APJifengc @ 2022-03-29 20:50:17

在数组比较大的时候,不要使用大括号初始化数组。

你自己看看第一种方法本地编译出来的文件大小,应该有大约 23MB。

这是因为,如果你用大括号初始化,编译器会将整个数组全部初始化。然后你的可执行文件就已经存了5000*5000这么大的数组了,就炸了

前几天模拟赛我们机房就有人因为这个CE了


by fengwu @ 2022-03-29 20:51:29

数组太大了导致编译展开,文件太大死掉了

你可以看看本地编译时间是不是很长

最好不要在定义的时候初始化,慢死


by fengwu @ 2022-03-29 20:51:53

@APJifengc 哈哈哈


by Q9_KKK @ 2022-03-29 21:15:57

感谢感谢,悟了悟了!


|