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

先说思路:首先需要知道所有需要用来建设的区域,再将它们求并集,最后再减去它们,还有要注意一共是l+1棵树,那么该如何求并集呢?

1 . 是先求出最终所有的区域,然后再减去它们求剩余的树吗?其实是可以的,可以先设置一个数组a,将输入的区域的起始和终点都输入其中,这样起始点的索引就都是偶数(从0开始),之后再用三个if判断4种情况,两边都包含,一边包含(2种),互相独立,最后一种可以单独用数组来放置,最后减去组间差距就好,嗯嗯,是不是听起来很棒?你可以自己试一下,其实没那么简单,那我为什么要说,就是要引出下面快速的解法;

2.正常解法:直接让这个区域内的树索引都为0,最后直接计算剩余的不为0的数,得出的就是剩余的树的数量;

#include<stdio.h>
int main(){
    int l,m;
    scanf("%d %d",&l,&m);
    int count=0;
    int a[10000]={0};
    int start,end;
    for(int i=0;i<m;i++){
        scanf("%d %d",&start,&end);
        for(int t=start;t<=end;t++){
            a[t]=1;
        }
    }
    for(int j=0;j<=l;j++){
        if(a[j]==1){
            count+=1;
        }
    }
    printf("%d",l+1-count);
    return 0; 
}

还有这里其实可以直接用count记数值为0的元素就好,还省的printf那一步还要做一步减法。

注意:题目下方有对道路的长度 l 做出限制,其小于等于10000,所以这里将数组a的长度设置为10000。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值