【2043】校门外的树

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;	
}


 

原文地址:https://www.cnblogs.com/AWCXV/p/7632506.html