Bootstrap

洛谷P1047 校门外的树

         目录

题目描述

输入格式

输出格式

输入输出样例

说明/提示


题目描述

某校大门外长度为 l 的马路上有一排树,每两棵相邻的树之间的间隔都是 1米。我们可以把马路看成一个数轴,马路的一端在数轴 0的位置,另一端在 l 的位置;数轴上的每个整数即0,1,2,...,l,都种有一棵树。

由于马路上有一些区域要用来建地铁。这些区域用它们在数轴上的起始点和终止点表示。已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。现在要把这些区域中的树(包括区域端点处的两棵树)移走。你的任务是计算将这些树都移走后,马路上还有多少棵树。

输入格式

第一行有两个整数,分别表示马路的长度 l 和区域的数目 m。

接下来 m 行,每行两个整数 u,v,表示一个区域的起始点和终止点的坐标。

输出格式

输出一行一个整数,表示将这些树都移走后,马路上剩余的树木数量。

输入输出样例

输入#1

500 3
150 300
100 200
470 471

输出#1

298

说明/提示

【题目解析】首先说校门外有一排树,马路上有一些区域需要建地铁。把校门外的马路看成一段数轴。以0为标准,输入的第一个起始点记为k1,第一个终点为k2。l为马路长度,m为区域数目。

看输入格式

第一行代表马路长度和区域数目,并且中间用一个空格隔开。

第二行之后分别代表移走的树的起始点和终止点,中间用空格隔开。

(1)首先我们先创建好变量。l表示马路长度(1=<l<=10000),m(1=<m<=100)为区域数目,k1表示起始点的坐标,k2表示终止点坐标。可以创建一个数组a[10001]存储留下来的树,初始值为0。有树的记为0,没有树的记为1。

 

#include<iostream>
using namespace std();
int main()
{
int l,m,k1,k2;
return 0;
}

(2)然后我们分析题意。题目说把马路看成一个数轴l,区域数目为m。马路的一段为数轴0的位置,另一端在l的位置。每两棵相隔的树之间的间隔都是1米。故数轴上的0,1,2,3...l都种了树。

因此我们可以创建一个数组来存储区域数目。

#include<iostream>
using namespace std;
int main()
{
int l,m,k1,k2,a[10001]={0};
return 0;
}

输入l和m,l为马路长度,m为区域数目。

#include<iostream>
using namespace std;
int main()
{
int l,m,k1,k2,a[10001]={0};
cin>>l>>m;
return 0;
}

我们定义为种的树记为0,被砍的树记为1。接着我们判断砍了多少棵树。输入k1和k2,k1为砍树的起始点,k2为砍了树的终止点。

#include<iostream>
using namespace std;
int main()
{
int l,m,k1,k2,a[10001];
cin>>l>m;
for(int i=1;i<=m;i++)//从数轴的1开始到最后一位数字(0处没有种树)
{
     cin>>k1>>k2;//输入起始值和终止值
     {
          for(int j=k1;j<=k2;j++)//从起始值到终止值开始遍历
          {
              a[j]=1;
          }
     }

}
return 0;
}

接着判断那些位置是0(种了树的部分),如果是0就创建一个为0 的新的变量count进行存储,并且最后将count输出。

#include<iostream>
using namespace std;
int main()
{
int l,m,k1,k2,a[10001];
cin>>l>m;

//砍树的棵树
for(int i=1;i<=m;i++)//从数轴的1开始到最后一位数字(0处没有种树)
{
     cin>>k1>>k2;//输入起始值和终止值
     {
          for(int j=k1;j<=k2;j++)//从起始值到终止值开始遍历
          {
              a[j]=1;
          }
     }

}



//剩余种了的树

 for(int i=0;i<=l;i++)
  {
     if (a[i]=0)
     {
        count++;
     }
  }

return 0;
}

【完整代码】

#include<iostream>
using namespace std;
int main()
{
int l,m,k1,k2,a[10001];
cin>>l>m;

//砍树的棵树
for(int i=1;i<=m;i++)//从数轴的1开始到最后一位数字(0处没有种树)
{
     cin>>k1>>k2;//输入起始值和终止值
     {
          for(int j=k1;j<=k2;j++)//从起始值到终止值开始遍历
          {
              a[j]=1;
          }
     }

}



//剩余种了的树

 for(int i=0;i<=l;i++)
  {
     if (a[i]=0)
     {
        count++;
     }
  }

return 0;
}

【说明/提示】

在分析样例的过程中。注意被砍掉的树不要重复。

例如:

输入样例:       500 3

                        150 300

                        100 200

                        470 471

输出样例:    298

 

区间[150,300]之间共有150棵树需要被砍伐。[100,200] 中与第一个区间有所重合,而在第一个区间中第151棵树已经被砍伐,故第二个区间实际应为[100,149]共有49棵树。区间[470,471]中有2棵树。一共202棵树,故剩余298棵树。

;