有一个长度为整数L(1<=L<=10000)的马路,可以想象成数轴上长度为L的一个线段,起点是坐标原点,在每个整数坐标点有一棵树,即在0,1,2,…,L共L+1个位置上有L+1棵树。 现在要移走一些树,移走的树的区间用一对数字表示,如 100 200表示移走从100到200之间(包括端点)所有的树。 可能有M(1<=M<=100)个区间,区间之间可能有重叠。现在要求移走所有区间的树之后剩下的树的个数。
输入描述:
两个整数L(1<=L<=10000)和M(1<=M<=100)。
接下来有M组整数,每组有一对数字。
输出描述:
可能有多组输入数据,对于每组输入数据,输出一个数,表示移走所有区间的树之后剩下的树的个数。
示例1
输入
500 3
100 200
150 300
470 471
输出
298
题解
分出两个while进行输入,首先输入树的总数l,再记录下面有几个区间m;第二个while记录每个区间的起止位置i,j
用memset()建立一个全为0的数组,将每个区间里的整数都置为1,最后统计剩下的树个数sum(即0的个数)
c++11
#include<iostream>
#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<string.h>
#include<algorithm>
#include<map>
#include<vector>
#include<queue>
using namespace std;
int main(){
#ifdef ONLINE_JUDGE
#else
freopen("1.txt", "r", stdin);
//在这个模板的同一级目录下建一个'1.txt'的文件
//然后把输入全部放进去保存,之后运行代码完全不用输入任何数据
#endif
int l,m;
int a[10001];
while (cin>>l>>m){
memset(a,0,sizeof(a));
int i,j;
int sum=0;
while(m--){
cin>>i>>j;
for(;i<=j;i++){
a[i]=1;
}
}
for(i=0;i<=l;i++)
if(!a[i])
sum++;
cout<<sum<<endl;
}
return 0;
}
感想:
memset(数组名, 值, sizeof(数组名)); 为啥把数组变全0而不是1呢?
因为memset是按字节赋值,对每个字节赋值同样的值,这样int四个字节会附相同的值(这也是它为什么是在 cstring 里的原因)。而0二进制代码全为0,不容易错。
那么赋值为 1 时呢,一个 int 四个四节,每个字节变成 1,那就是:
00000001 00000001 00000001 00000001
转换成10进制也就是16843009。
以后用 memset 的时候就要注意了,一般拿它来置零就行了