2021年3月13日
这貌似一个特别简单的题,但昨天晚上做这个题,整整提交了20次。
索引
一、问题出现
问题来源 - 点击链接:贪心算法 - A.A
当时出现的问题基本是Wrong Answer
和Time 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;
}
看起来很对是吧。但结果是这样的:
Status | Length | Lang | Submitted | Shared |
---|---|---|---|---|
Wrong Answer | 394 | C++ | 2021-03-12 22:05:48 | no |
(黑人问号.jpg)
于是乎,我进行了几十次的排查。。。
首先排除算法问题,我对这个算法持100%信心。
二、问题排查
1.是没加ios::sync_with_stdio(false)吗?
这是加了后的结果:
Status | Length | Lang | Submitted | Shared |
---|---|---|---|---|
Wrong Answer | 416 | C++ | 2021-03-12 22:10:09 | no |
2.是i和j在for循环里定义的问题吗?
这是在外面定义了后的结果:
Status | Length | Lang | Submitted | Shared |
---|---|---|---|---|
Time Limit Exceeded | 402 | C++ | 2021-03-12 23:16:29 | no |
发现了吧,这次成了Time Limit Exceeded了。
3.是不该用cin和cout的原因吗?
这是用了scanf和printf后的结果:
Status | Length | Lang | Submitted | Shared |
---|---|---|---|---|
Wrong Answer | 413 | C++ | 2021-03-12 23:20:23 | no |
看了又不是。
4.是不该用C++而是G++的原因吗?
这是用了scanf和printf后的结果:
Status | Length | Lang | Submitted | Shared |
---|---|---|---|---|
Wrong Answer | 413 | G++ | 2021-03-12 23:22:01 | no |
看来还不是。
5.是。。。别问了,一律是下面的结果:
Status | Length | Lang | Submitted | Shared |
---|---|---|---|---|
Wrong Answer | 455 | G++ | 2021-03-12 23:25:42 | no |
Status | Length | Lang | Submitted | Shared |
---|---|---|---|---|
Time Limit Exceeded | 442 | G++ | 2021-03-12 23:33:23 | no |
三、终于,过了一天,经过一番折腾,我知道了问题所在:
我先贴正确代码:
#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;
}
结果:
Status | Length | Lang | Submitted | Shared |
---|---|---|---|---|
Accepted | 388 | G++ | 2021-03-13 16:03:21 | no |
Ohhhhhhhhhhhhhhhhhhhhhhhhhh!!!
总结一下,这次出错的原因如下:
Wrong Answer | Time 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次了,但我长了个教训,不好吗?