c语言求助,实在看不出来错在那里了,求大佬康康

P1047 [NOIP2005 普及组] 校门外的树

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

@黄鱼君 好滴,谢谢大佬


|