1. 程式人生 > >外行小白的IT成長之路(五)校門外的樹

外行小白的IT成長之路(五)校門外的樹

校門外的樹

  1. 問題描述
  2. 輸入資料
  3. 輸出要求
  4. 輸入樣例
  5. 輸出樣例
  6. 解題思路
  7. 參考程式

1、問題描述 某校的大門外有一棵樹,沒兩顆樹相鄰距離為1m,把馬路看成是一個數軸,馬路的一端在0,一端在L的位置。數軸上每個整數點都有一個棵樹 校門外要用一些地方修建地鐵,這些地方在數軸上的起始位置和中止位置都是在整數。區域之間可能有重疊的地方。因為要修地鐵,這些地方的樹都要被移走(包括區域的起始位置和中止位置)。任務是計算,這些樹都移走之後,還有多少樹在馬路上。

2、輸入資料 輸入第一行有兩個整數L(0<=L<=10000)和M(1<=M<=100),L代表馬路的長度,M代表區域的數目。 接下來有M行 ,每一行有兩個整數,用一個空格隔開,代表一個區域的起始點和中止點。

3、輸出要求 輸出包括一行,只有一個整數,表示馬路上剩餘的樹的數目。

4、輸入樣例 500 3 150 300 100 200 470 471

5、輸出樣例 298

6、解題思路 這個題目最顯然的思路就是暴力求解。從0到L開始遍歷,對於每一個整數,都可以判斷這個整數是否在這些區域內,把沒有在區域內的整數相加就是得到的答案。 對於每個整數,判斷這個點是否在每一個區域內,具體做法是如果這個點的座標如果落入了某個區域的起始位置到中止位置中,那麼這個點一點不是我們要找 的那些點。細節都在程式碼裡面。

7、參考程式碼

#include<stdio.h>
#include<math.h>
#include<stdlib.h>
#include<string.h>
void main()
{
	int L,M,i,j,begin[100],end[100],jishu=0,flag;
	scanf("%d%d",&L,&M);
	for(i=0;i<M;i++)
	{
		scanf("%d%d",&begin[i],&end[i]);
	}
	for(i=0;i<=L;i++)
	{
		flag=0;                                 //用於記錄點是否在區域內
		for(j=0;j<M;j++)
		{
			if(i>=begin[j]&&i<=end[j])  //如果點在某個區域內,flag=1,中止對該點的判斷
			  {   
				  flag=1;
				  break;
				}
		}
		if(flag==0)                         //flag=0的點代表在我們的考慮範圍之內
		{
			jishu++;
		}
	}
	printf("%d",jishu);
}