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


思路:
这道题我的想法非常简单,就是暴力遍历,定义一个大小为10000的数组
因为这道题中的马路长度L的最大值仅仅为10000,挨个遍历最坏的情况也就是遍历1遍大小为1000的数组,故而影响不大
先将数组中的元素全部初始化为1,然后在每行输入u,v时,从u到v遍历数组,让数组中的值,从flag[u]-flag[v](包括端点),让它们的值变为2(方便后续查找剩余多少棵树)
再经历m轮输入u,v之后。在u-v区间内的数组的值,都变为2。我们只要计算数组中有多少个1,这个答案就是最终的结果。
具体可以编译运行的代码如下:
#include<iostream>
#include<cstring>
using namespace std;
#define MAX_L 10000
int main()
{
int L, m;
cin >> L >> m;
int flag[MAX_L];
memset(flag, 0, sizeof(flag));
//将数组元素全部初始化为1
for (int i = 0; i <= L; i++) flag[i] = 1;
//循环m轮,每轮都输入u,v。并让flag[u]-flag[v]之间的所有值都变为2
for (int i = 0; i < m; i++) {
int u, v;
cin >> u >> v;
for (int j = u; j <= v; j++) flag[j] = 2;
}
//用于存储有多少棵树
int count = 0;
for (int i = 0; i <= L; i++) {
if (flag[i] == 1) count++;
}
cout << count;
return 0;
}
浙公网安备 33010602011771号