第一行输入两个整数
,用空格隔开,表示马路的长度和地铁施工区域数,满足
,
。
接下来
行,每行输入两个整数
,用空格隔开,表示第
个施工区域的起始点和终止点的坐标,满足
。
输出一个整数,表示移除所有施工区域内(包括端点)树后,剩余的树的总棵树数。
500 3 150 300 100 200 470 471
298
马路上共有棵树。施工区域 [150,300] 中含有
棵,[100,200] 中含有
棵,[470,471] 中含有
棵。三个区域的重叠部分 [150,200] 有
棵被重复移除,所以实际移除的树数为
,因此剩余
棵。
10 2 2 5 4 8
4
马路上共有棵树。区域 [2,5] 移除
棵,区域 [4,8] 移除
棵。重叠部分 [4,5] 有
棵被重复移除,所以实际移除
棵,剩余
棵。
这是我的答案,虽然跟使一样但是我觉得很好理解也很直接
#include <stdio.h>
int main() {
int L,M;
scanf("%d %d",&L,&M);
int tree[20000]={0};
for(int i=0;i<=L;i++){
tree[i]=1;
}
int l[M];
int r[M];
for(int i=0;i<M;i++){
scanf("%d %d",&l[i],&r[i]);
}
for(int i=0;i<M;i++){
for(int j=l[i];j<=r[i];j++){
tree[j]=-1;
}
}
int cnt=0;
for(int i=0;i<=L;i++){
if(tree[i]==1){
cnt++;
}
// printf("%d.%d ",i,tree[i]);
}
printf("%d",cnt);
return 0;
} #include <stdio.h>
void shu(int a[],int l,int r,int L)
{
for(int i=0;i<=L;i++)
{
if(i>=l&&i<=r)
{
a[i]=1;
}
}
}
int main() {
int L,M;
scanf("%d%d",&L,&M);
int a[10000]={0};
int n=M;
for(int i=0;i<n;i++)
{
int l,r;
scanf("%d%d",&l,&r);
shu(a,l,r,L);
}
int hen=0;
for(int i=0;i<=L;i++)
{
if(a[i]==0)
{
hen++;
}
}
printf("%d",hen);
}