校门外的树
某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米。可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置;数轴上的每个整数点,即0,1,2,……,L,都种有一棵树。由于马路上有一些区域要用来建地铁。这些区域用它们在数轴上的起始点和终止点表示。已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。现在要把这些区域中的树(包括区域端点处的两棵树)移走。你的任务是计算将这些树都移走后,马路上还有多少棵树。
刷数组
开一个bool类型的数组tree[L],表示每个位置上的数有没有被砍掉。
对于每个区间[a,b]
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 10010;
int n, m;
bool tree[N];
int main()
{
cin>>n>>m;
for(int i = 0; i < m; i ++)
{
int l, r;
cin>> l >> r;
for(int j = l; j <= r; j++) tree[j] = true;//将被砍的树标记为1;
}
int res = 0;
for(int i = 0; i <= n; i ++)
{
if(tree[i] == false)//数组中为0的数为还剩下的树;
res ++;
}
cout<<res<<endl;
return 0;
}
区间合并
1.先将所有区间按左端点排序
2.从前往后依次扫描每个区间,维护当前正在合并的区间的左右端点[st, ed],对于当前枚举的区间[q[i].x,q[i].y]
case1:如果ed<q[i].x
将[st, ed]放在答案集合中,再令st=q[i].x,ed=q[i].y
case2:如果ed>=[i].x
令 ed=max(ed,q[i].y)
#include<cstring>
#include<iostream>
#include<algorithm>
#define x first
#define y second
using namespace std;
typedef pair<int, int> PII;
const int N = 110;
int n, m;
PII q[N];
int main()
{
int sum = 0;
cin >>n >> m;
for(int i = 0;i < m; i ++) cin >> q[i].x>>q[i].y;
sort(q,q+m);
int st = 0,ed = -1;
for(int i = 0;i < m; i ++)
if(ed < q[i].x)
{
sum += ed -st + 1;
st = q[i].x, ed=q[i].y;
}
else ed = max(ed, q[i].y);
sum += ed-st+1;
cout<<n+1-sum<<endl;
return 0;
}