POJ2808 校门外的树

题目描述:


这个题目其实就是小学题目,我记得我上小学二三年纪都写过这种应用题。当然现在不是让你直接给答案,你是编程来实现。

说实话,这个题目我已看完,我是没有个直接想法怎么实现,首先是按照我们做题的习惯,要不要把输入的区间都存在一个二维数组里面,后面依次对每个区间进行对有过的区间看有没有重复。后面我想这个很复杂,不好。然后就想着遍历的方式吧!用一个一维数组的每个元素代表一棵树,因为数组定义了其初值都是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;
} 

  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值