Time Limit: 20 second
Memory Limit: 20 MB
问题描述:
某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米。我们可以把马路看做一个数轴,马路的一端在数轴的0的位置,另一端在L的位置;数轴上的每个整数点,即0,1,2,3,4…,L都种有一棵树。由于马路上有一些区域要用来建地铁,这些区域用他们在数轴上的起点和终点标志。已知,任意区域的起点和终点的坐标都是整数,区域之间可能有重合的部分。现在要把这些区域中的树(包括区域两端的端点两棵树)都移走。你的任务是计算将这些树都移走后,马路上还有多少棵树。(只考虑单向)。
Input
第一行包含两个整数L(1<=L<=10000)和M(1<=M<=100)。 L代表马路的长度,M代表区域的数目,L和M之间用空格隔开;
接下来的M行,每行包含两个不同的整数,用一个空格隔开,表示一个区域的起点和终点坐标。
Output
输出文件包括一行,这一行包括一个整数,表示马路上剩余的树的数目。
Sample Input
500 3 150 300 100 200 470 471
Sample Output
298
【题解】
用一个bool数组来表示路,true和false用于标记树的状态。根据输入的区间for 一下置相应区间的bool数组为false。最后再for一遍路的长度,记录一下树的数目就好.
【代码】
#include <cstdio> const int MAXL = 10000+10; int l,m,number=0; bool a[MAXL]; void input_data() { scanf("%d %d",&l,&m); for (int i = 0;i <= l;i++) //初始化一下路上的树的状态 a[i]=true; for (int i = 1;i <= m;i++) //输入一个区间 并从左到右修改树的状态 { int l,r; scanf("%d %d",&l,&r); for (int j = l;j <= r;j++) a[j] = false; } } void get_ans() { for (int i= 0;i <= l;i++) //最后再扫描一遍,记录树的总棵数 if (a[i]) number++; } void output_ans() { printf("%d",number); } int main() { input_data(); get_ans(); output_ans(); return 0; }