123_Ves @ 2022-12-17 22:35:41
求大佬看看,为什么结果对的上但通不过,第一个点能过后面的都过不了,我下载了数据,输入发现结果是对的
#include<stdio.h>
int main(void)
{
int L,n,i,j,h=0,a[20000],b[300];
scanf("%d %d",&L,&n);
for(i=0;i<n;i++)
scanf("%d %d",&b[2*i],&b[2*i+1]);
for(i=0;i<=L;i++)
a[i]=i;
for(i=0;i<=2*n;i=i+2)
{
for(j=0;j<=L;j++)
{
if(a[j]>=b[i]&&a[j]<=b[i+1])
a[j]=-1;
}
}
for(i=0;i<=L;i++)
if(a[i]!=-1)
h++;
printf("%d",h);
}
当我把最后的printf("%d",h)改为printf("%d",h+1),就会第一个不过,剩下的全通过。 没看懂问题出在哪里,麻烦大佬帮忙看看。
by hyj0824 @ 2022-12-18 00:36:33
建议你把算法思路写到注释里面 读起来舒服些
比较明显的一个问题是 那个for循环i<=2n应该是i<2n
可以试着这样:先全部标记为1,对于每个区间进行遍历,标记种树的点为1,不种树的点为0,若已经为0则保持不变,最后统计1的个数
by 123_Ves @ 2022-12-18 10:39:35
@黄鱼君 谢谢大佬!已经AC了,下次一定写注释(不好意思哈,懒了一下就没写了)。确实,写完之后觉得好像不用给a[i]赋值为i(这样写好像有点奇怪)直接全赋值为1作为标记就好了,谢谢大佬提醒,但是,我不太明白当i=2n时,b[i]已经是垃圾值了,那这样的话,感觉不会对将a[]置-1的过程产生影响,我试了一下,更改前后最后的输出是一样的,但改过之后可以AC,不该就不行,这是为啥
by hyj0824 @ 2022-12-18 11:21:17
@123_Ves 不好意思没太听明白,是把等于号删了就能过,不删就不能过是吧?
如果在函数体里面声明的数组,垃圾值不一定全是0,也就是说i=2n的时候,去访问b数组得到的数值是不确定的
by 123_Ves @ 2022-12-18 11:29:25
@黄鱼君 嗯,就是删了可以过,不删过不了 原来是这样啊,i=2n时b[i]是不确定的,哦哦懂了,谢谢大佬
by hyj0824 @ 2022-12-18 11:44:05
@123_Ves 所以说,数组最好开在函数外面,这样数组会自动初始化为0
by 123_Ves @ 2022-12-19 16:55:27
@黄鱼君 好滴,谢谢大佬