先说思路:首先需要知道所有需要用来建设的区域,再将它们求并集,最后再减去它们,还有要注意一共是l+1棵树,那么该如何求并集呢?
1 . 是先求出最终所有的区域,然后再减去它们求剩余的树吗?其实是可以的,可以先设置一个数组a,将输入的区域的起始和终点都输入其中,这样起始点的索引就都是偶数(从0开始),之后再用三个if判断4种情况,两边都包含,一边包含(2种),互相独立,最后一种可以单独用数组来放置,最后减去组间差距就好,嗯嗯,是不是听起来很棒?你可以自己试一下,其实没那么简单,那我为什么要说,就是要引出下面快速的解法;
2.正常解法:直接让这个区域内的树索引都为0,最后直接计算剩余的不为0的数,得出的就是剩余的树的数量;
#include<stdio.h>
int main(){
int l,m;
scanf("%d %d",&l,&m);
int count=0;
int a[10000]={0};
int start,end;
for(int i=0;i<m;i++){
scanf("%d %d",&start,&end);
for(int t=start;t<=end;t++){
a[t]=1;
}
}
for(int j=0;j<=l;j++){
if(a[j]==1){
count+=1;
}
}
printf("%d",l+1-count);
return 0;
}
还有这里其实可以直接用count记数值为0的元素就好,还省的printf那一步还要做一步减法。
注意:题目下方有对道路的长度 l 做出限制,其小于等于10000,所以这里将数组a的长度设置为10000。