题目描述:
这个题目其实就是小学题目,我记得我上小学二三年纪都写过这种应用题。当然现在不是让你直接给答案,你是编程来实现。
说实话,这个题目我已看完,我是没有个直接想法怎么实现,首先是按照我们做题的习惯,要不要把输入的区间都存在一个二维数组里面,后面依次对每个区间进行对有过的区间看有没有重复。后面我想这个很复杂,不好。然后就想着遍历的方式吧!用一个一维数组的每个元素代表一棵树,因为数组定义了其初值都是0,那我就按输入L给钱0—L的元素赋值1,再后来对没一个区间的元素赋值为0。最后最后,统计元素为1的个数,那就是还剩树苗的颗数。
其实我的思路跟官方的一样的,只是具体细节不同。还有说明一点,对于大数数组,定义在main函数外面比较保险,全局变量在静态存储区分配内存,局部变量是在栈上分配内存空间的。(c语言程序在运行时会动态创建一个堆栈段,里面存放着调用栈,保存着函数的调用关系和局部变量。)如果数组太大,可能会造成栈溢出。
下面是我写的代码:
#include<stdio.h>
int a[10001];
int main()
{
int L,M;
int light,right;
int sum=0;
scanf("%d %d",&L,&M);
for(int i=0;i<=L;i++)
{
a[i]=1;
} //数组中元素没有赋值其初值为0
while(M>0)
{
scanf("%d %d",&light,&right);
for(int j=light;j<=right;j++)
a[j]=0;
M--;
}
for(int k=0;k<=L;k++)
if(a[k]==1)
sum++;
printf("%d\n",sum);
return 0;
}
再给个官方的代码和结题思路:
结题思路:该问题可以通过直接模拟来实现。使用一个元素个数为10001的大数组来标定第1~L+1颗数的状态。对于某个输入的小区间,将区间内的树全部标定为移走即可。最初,这些树都没有移走,1~L+1全部标记为0或false。每当输入一个小区间,就将区间内的树全部移走,即将这个区间内对应下标的位置标记为1或true。当所有小区间都输入完成后,计算剩下的值扔为0或false的元素个数,就可以得到最后剩下的数的个数。
参考程序:
#include<cstdio>
#include<cstring>
int main()
{
int m,n,l,k;
int a[10001];
while(scanf("%d%d",&m,&n)!=EOF)
{
memset(a,0,sizeof(a));
while(n--)
{
scanf("%d%d",&l,&k);
for(int i=l;i<=k;i++)
{
a[i]=1;
}
}
int count=0;
for(int j=0;j<=m;j++)
{
if(a[j]==0)
count++;
}
printf("%d\n",count);
}
return 0;
}