【修代码Issue_01】在vjudge中使用long long类型数组的大坑

2021年3月13日

这貌似一个特别简单的题,但昨天晚上做这个题,整整提交了20次。

一、问题出现

问题来源 - 点击链接:贪心算法 - A.A
当时出现的问题基本是Wrong AnswerTime Limit Exceeded
但是经过仔细检查,问题不可能出现在算法里。也就是说,代码的一个小细节地方出现了问题。
当时的代码是这样的:

#include <iostream>
#include <algorithm>
#include <cmath>

using namespace std;

int main()
{
    long long count = 0, N;
    long long cow[10010];
    cin >> N;
    for (long long i = 0; i < N; i++) cin >> cow[i];
    sort(cow, cow + N);
    for (long long i = 0; i < N; i++) {
        for (long long r = 0; r < N; r++) {
            count += llabs(cow[r] - cow[i]);
            //注意long long类型不能用abs(),要用llabs()
        }
    }
    cout << count;
    return 0;
}

看起来很对是吧。但结果是这样的:

StatusLengthLangSubmittedShared
Wrong Answer394C++2021-03-12 22:05:48no

(黑人问号.jpg)
于是乎,我进行了几十次的排查。。。

首先排除算法问题,我对这个算法持100%信心。

二、问题排查

1.是没加ios::sync_with_stdio(false)吗?

这是加了后的结果:

StatusLengthLangSubmittedShared
Wrong Answer416C++2021-03-12 22:10:09no

2.是i和j在for循环里定义的问题吗?

这是在外面定义了后的结果:

StatusLengthLangSubmittedShared
Time Limit Exceeded402C++2021-03-12 23:16:29no

发现了吧,这次成了Time Limit Exceeded了。

3.是不该用cin和cout的原因吗?

这是用了scanf和printf后的结果:

StatusLengthLangSubmittedShared
Wrong Answer413C++2021-03-12 23:20:23no

看了又不是。

4.是不该用C++而是G++的原因吗?

这是用了scanf和printf后的结果:

StatusLengthLangSubmittedShared
Wrong Answer413G++2021-03-12 23:22:01no

看来还不是。

5.是。。。别问了,一律是下面的结果:

StatusLengthLangSubmittedShared
Wrong Answer455G++2021-03-12 23:25:42no
StatusLengthLangSubmittedShared
Time Limit Exceeded442G++2021-03-12 23:33:23no

三、终于,过了一天,经过一番折腾,我知道了问题所在:

我先贴正确代码:

#include <algorithm>
#include <cstdio>

using namespace std;

int cow[10005];

int main()
{
    long long num = 0;
    int N, i, r;
    scanf("%d", &N);
    for (i = 0; i < N; i++)
        scanf("%d", &cow[i]);
    sort(cow, cow + N);
    for (i = 0; i < N; i++)
    {
        for (r = 0; r < N; r++)
            num += abs(cow[r] - cow[i]);
    }
    printf("%lld", num);
    return 0;
}

结果:

StatusLengthLangSubmittedShared
Accepted388G++2021-03-13 16:03:21no

Ohhhhhhhhhhhhhhhhhhhhhhhhhh!!!
总结一下,这次出错的原因如下:

Wrong AnswerTime Limit Exceeded
采用了llabs用了cin和cout以及加速函数
把数组定义到了main函数里把数组定义到了main函数里
for循环内嵌i与j定义for循环内嵌i与j定义
用了sync_with_stdio(false)用了sync_with_stdio(false)
看右边 ->cow[10010]用long long类型定义的

最重要的一点:

我把cow[10010]用long long类型定义的!!

四、总结:

1.能少减少复杂代码就别个自己添麻烦。

2.别用long long定义数组。
这是最重要的。

3.别怕出现问题。
你看我都提交40次了,但我长了个教训,不好吗?

评论 7
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值