“第五十七天”

不出意外的话,机组这周也就过完了,不过就真的是简单过一遍,先简单有个印象吧,这样看的话还是放假之前还是有机会把四大件都过一遍的。

这个思路,真的太神了,当然也是自己太弱了,就这我还为自己想出用 1/0 来表示树是否存在,然后求和而自喜呢,他这个思路真的好厉害。

把区域看成 左开右闭,吗,每次输入一个区域的时候,都把这个区域的左边对应的树的位置所在数组位置设为 +1 ,右边对应的设为 -1 ,然后在后面的判断的时候通过 flag  的值来进行判断,当flag 为正的时候表示从左边进入了一个区域,每进入一个区域都会加(多个区域可能重合),每出一个区域 flag -1 .如果flag 不为 0,表示还没有出去所有的区域,真的是很厉害的思路。

他下面还有个 continue 也很细节,要是一个区域没有重合,或者在外围,那么当出这个区域的时候,flag 的值 会在右端点的时候变成 0 ,如果这个时候不跳出本次循环的话,会多记树的数量。nd。

我的

#include<stdlib.h>

int main()
{
	int l = 0, m = 0;
	scanf("%d %d", &l, &m);
	int* b = (int*)malloc(sizeof(int) * l+1);//开辟存放树的数组
	int(*a)[2] = (int*)malloc(sizeof(int)*2 * m);//开辟存放区域的数组,
//a的数组是一个数组指针数组,每个元素指向的是一个二维数组
	int i = 0;
	for (i = 0; i < m; i++)
	{
		scanf("%d %d", &a[i][0],&a[i][1]);
	}
	i = 0;
	for (i = 0; i <= l; i++)
	{
		b[i] = 1;//每一个树初始为1
	}
	int j = 0;
	while (m--)
	{
		for (i = a[j][0]; i <= a[j][1]; i++)
		{
			b[i] = 0;//如果区域内的树变成 0 ,表示被覆盖
		}
		j++;
	}
	j = 0;
	for (i = 0; i <= l; i++)
	{
		if (b[i] == 1)// 1 表示树还在,看看有多少个1
			j++;
	}
	printf("%d", j);
	return 0;
}

 他的

#include <stdio.h>
int a[10005];
int main() {
    int x, y, l, m, i, ans = 0, flag = 0;
    scanf("%d%d",&l,&m);
    for(i = 1; i <= m; i++){
        scanf("%d%d",&x,&y);
        a[x]++;//左端点为正
        a[y]--;//右端点为负,只有两个都遍历到flag变为0
    }
    for(i = 0; i <= l; i++){
        if(a[i] != 0){
            flag += a[i];
            continue;//若不结束,右端点可能被计入ans
        }
        if(flag == 0)ans++;
    }
    printf("%d\n",ans);
}

 就做了两道....

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值