不出意外的话,机组这周也就过完了,不过就真的是简单过一遍,先简单有个印象吧,这样看的话还是放假之前还是有机会把四大件都过一遍的。
这个思路,真的太神了,当然也是自己太弱了,就这我还为自己想出用 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);
}
就做了两道....