解题思路:
定义一个数组;数组下标代表数轴上的每个整数点即0,1,2,……,n(长度为500的公路有501颗树);
把这个数组初始化全为1(为1代表有树,0代表被移除);

输入移除区域(x,y),把这个区域上的树全置0;(有多个,用循环控制);

输出为1的树的数目;

注意事项:
数轴上的0点也有数;




参考代码:

#include<stdio.h>
void chushihua(int *a,int n);
void yichu(int *a,int x,int y);
void output(int *a,int n);
void function();
/*--------------------------------------------------*/
int main()
{
  function();
  return 0;
}
/*--------------------------------------------------*/
void function()
{
 int n,h;
 int x,y;
 int a[10001];
 while(scanf("%d%d",&n,&h)!=EOF)
 {
  chushihua(a,n);

  for(int i=0;i<h;i++)
   {scanf("%d%d",&x,&y);yichu(a,x,y);}
   output(a,n);
 }
return ;
}
/*--------------------------------------------------*/
void chushihua(int *a,int n)
{
 for(int i=0;i<=n;i++)
  a[i]=1;
  return ;
}
/*--------------------------------------------------*/
void yichu(int *a,int x,int y)
{
 for(int i=x;i<=y;i++)
  a[i]=0;
  return ;
}
/*--------------------------------------------------*/
void output(int *a,int n)
{
 int sum=0;
 for(int i=0;i<=n;i++)
  {if(a[i]==1)sum++;}

  printf("%d\n",sum);
  return ;
}


点赞(26)
 

0.0分

10 人评分

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

评论列表 共有 18 条评论

林有德 4年前 回复TA
#include <stdio.h>


int main()
{ int L,M,a,b,c;
c=0;
scanf("%d %d",&L,&M);
if(M>100&&M<1&&L<1&&L>1000)
return -1;
int e[1000];
for(int r=0;r<1000;r++)
e[r]=0;
for(int t=0;t<M;t++)
{scanf("%d %d",&a,&b);
for(int k=a;k<=b;k++)
e[k]=1;

}
for(int d=0;d<1000;d++)
if(e[d]==1)
c++;
printf("%d",L+1-c);

return 0;
}
为什么总是报这种错,VC6.0都能通过,求大佬解答Segmentation fault:段错误,检查是否有数组越界,指针异常,访问到不应该访问的内存区域
NEO 5年前 回复TA
哈哈哈和我思路一样呢~~~开心~
C杯 5年前 回复TA
Thumbs up ,思路很好,一下子就简化了代码
逻辑幻象 5年前 回复TA
#include<stdio.h>
int main(){
	int L,i,s,n1,n2,len=0;
	int a[10000];
	scanf("%d %d",&L,&s);
	for(i=0;i<=L;i++){
		a[i]=1;
	}
	int k=0;
	while(k<s){
		scanf("%d %d",&n1,&n2);
		for(i=n1;i<=n2;i++){
			a[i]=0;
		}
		k++;
	}
	for(i=0;i<=L;i++){
		if(a[i]==1){
			len++;
		}
	}
	printf("%d",len);
	return 0;
}
我的思路直接不考虑重跌的部分,有多少砍多少
GC 5年前 回复TA
思路很重要啊!
cpython3 6年前 回复TA
//gcc可以成功,提交时输出超限了,请教大佬帮忙分析一下原因。
#include <stdio.h>
//初始化数组为1 
void InitArray(int *a,int num)
{
	for(int i=0; i<=num; i++)
	{
		a[i]=1;	
	}
}
//将要移除的区域(x,y)置为0 
void InitZero(int *a,int x,int y)
{
	for(int i=x; i<=y; i++)
	{
		a[i]=0;		
	}	
} 
//输出值为1的即为结果 
void Result(int *a,int L)
{	
	int sum=0;
	for(int i=0; i<=L; i++)
	{
		if(a[i]==1)
			sum++;
	}
	printf("%d",sum);
}
int main()
{
	int a[10001]; //题意L<=10000 
	int L,M,x,y;
	while(scanf("%d%d",&L,&M))
	{
		InitArray(a,L);
		for(int i=0; i<M; i++)
		{
			scanf("%d%d",&x,&y);
			InitZero(a,x,y);
		}
			Result(a,L);
	} 
	return 0;
}
cpython3 6年前 回复TA
思路很棒,为大佬点赞
Manchester 7年前 回复TA
另外一种高效思路是:把重叠的区间去除,得到不重叠的区间,然后再“砍”,上面为了简单省事,就没有考虑重叠部分