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

洛谷 P1047 [NOIP2005 普及组] 校门外的树_第1张图片

 

 

 

 

 

 

 

这题思路也不难哒

不过有两个点需要注意哈

1、输入的区间可以重复,那么这个时候就不能把砍过的树再砍一遍了!我只能想到遍历一遍给标记啦~没砍过的标记为0,砍过的标记为1,最后记录数组为0的元素;

2、数组长度一定要比10000大捏!!因为路的长度为l,但是会有l+1棵树!!如果是tree[10000],那么会出现下面这种有意思的情况。

洛谷 P1047 [NOIP2005 普及组] 校门外的树_第2张图片

我改!

 洛谷 P1047 [NOIP2005 普及组] 校门外的树_第3张图片

 

可恶啊!听取WA声一片! 

 

下面的是对的:

#include
int main()
{
    int l = 0, m = 0;//马路长度和区间个数
    scanf("%d%d", &l, &m);
    int u = 0, v = 0;//区间的左右位置,u肯定小于v滴
    int tree[10001]={0};
    //树树全部初始化为0,代表没砍过
    for (int i = 0; i < m; i++)//一共有m个区间,那就得操作m次呐
    {
        scanf("%d%d", &u, &v);//想从哪砍到哪呢
        for (int j = u; j <= v; j++)
        {
            if(tree[j]==0)
            tree[j] = 1;//砍过的标记为1
        }
    }
    int sum = 0;//剩余sum棵树树还没被砍
    for (int k = 0; k <= l; k++)//遍历树树
    {
        if (tree[k] == 0) sum++;
    }
    printf("%d", sum);
    return 0;
}

 

 

 

你可能感兴趣的:(力扣,c语言,算法,笔记)