#include <cstring>
#include <iostream>
using namespace std;
int main(){
int L = 0, M = 0, num = 0;
char tree[10000];
cin >> L >> M;
memset(tree, 1, L * sizeof(char));
for (int i = 0; i < M; i++){
int a, b;
cin >> a >> b;
memset(tree + a * sizeof(char), 0, (b - a + 1) * sizeof(char)); //
}
for (int i = 0; i < L; i++){
num += tree[i] ? 1 : 0;
}
cout << num << endl;
}
这是程序
这是原题目
程序出现了不明的bug,当输入
500 3
150 300
100 200
470 471
时,我逐步排查过,依然不明白为什么程序会输出297而非298,而输入
1000 5
0 100
101 200
900 1000
207 400
401 899
时程序又正确地输出了6,这实在令人摸不着头脑ORZ
本来简单的题目却老是出一些不明就里的bug,快怀疑人生了……
明白了……
如果道路长度为x,那么应该有X + 1棵树,所以memset处应为(L + 1) * sizeof(char)而第二个for的第二个参数应为i <= L,问题即解决,而第二个输入之所以正确,是因为输入的环境中最后的一颗树(1000)是被砍伐了的,而第一个输入是错误的是因为本应为1的tree[500]并没有初始化。
经典写程序十分钟,排错一个小时