dalao求助,为什么我下载运行数据验证后答案是一模一样的,但是提交还是0分

P1255 数楼梯

Autumn_w @ 2024-07-13 23:08:23

#include <bits/stdc++.h>
#define up(r,l,i) for(int i=r;i<=l;i++)
#define dn(r,l,i) for(int i=r;i>=l;i--) 
using namespace std;
int n;
int c[1000], a[1000], b[1000],len;
void supperAdd(int x[], int y[]) {
    memset(c, 0, 1005);
    up(1, sizeof(b) / sizeof(b[0]), i) {
        c[i] += a[i] + b[i];
        c[i + 1] = c[i] / 10;
        c[i] = c[i] % 10;
    }
}
int main()
{
    cin >> n;
    a[1] = 1;
    b[1] = 2;
    len = 1;
    up(3, n, i) {
        supperAdd(a, b);
        memcpy(a, b, sizeof(b) / sizeof(b[0]));
        memcpy(b, c, sizeof(c) / sizeof(c[0]));
    }

    len = 999;
    while (c[len] == 0 && len > 1) len--;
    dn(len, 1, i) {
        cout << c[i];
    }
    return 0;
}

by anda @ 2024-07-13 23:19:18

不是,你为啥弄这么麻烦……弄的人看不懂你在怎么做


by Terrible @ 2024-07-13 23:21:07

这份代码在我这里跑样例都不过。输出了 3,呃呃。


by Terrible @ 2024-07-13 23:35:18

@Autumn_w

建议给编译器配置打开 O2,具体方法可以百度搜索。测试或者提交的时候最好都保证是开 O2 的,现在正规比赛一般都开 O2。

开不开 O2 的结果是可能有差异的,差异来源于不规范的行为。

memcpy memset 用得不对。memset、memcpy

sizeof(b) / sizeof(b[0]) 的结果是 1000,所以意味着访问到了 c[1000] 数组越界了。洛谷环境中 数组在内存之间大概的相对顺序。开 O2 的时候越界到 n 的位置了。


by Autumn_w @ 2024-07-14 16:09:52

@Terrible 感谢dalao,问题已经解决,的确是memcpy memset用法不对,访问到边界的问题,开O2后会中途停止,只输出3,导致结果出错。关注奉上%%%%%


|