算法思想:
例题:
AcWing 422. 校门外的树
第一次看完这个题第一反应就是暴力枚举呗
#include<iostream>
using namespace std;
int a[10005];//默认为false,表示没有被砍掉
int main()
{
int l,m,sum=0;
cin>>l>>m;
while(m--)
{
int fir,las;
cin>>fir>>las;
for(int i=fir;i<=las;++i)
a[i]=true;//表示被砍掉
}
for(int i=0;i<=l;++i)
if(!a[i])
sum++;
cout<<sum;
return 0;
}
区间合并:
#include<cstring>
#include<iostream>
#include<algorithm>
#define x first
#define y second
using namespace std;
typedef pair<int,int> PII;
const int N = 110;
int n,m;
PII q[N];
int main()
{
cin>>n>>m;
for(int i=0;i<m;++i) cin>>q[i].x>>q[i].y;//读入数组
sort(q,q+m);//排序
int sum=0;//被砍掉的树的数量
int st=0,ed=-1;//正在合并区间的左右端点,让右端点在左端点左边,是个小技巧
for(int i=0;i<m;++i)//遍历所有区间
if(ed<q[i].x)
{
sum += ed-st+1;//记得要加1
st=q[i].x,ed=q[i].y;
}
else ed=max(ed,q[i].y);
sum += ed-st+1;//最后一个区间也要计数,容易忘!!!!
cout << n+1-sum <<endl;
return 0;
}
#include<iostream>
#include<cstring>
#include<algorithm>
#define x first
#define y second
using namespace std;
typedef pair<int,int> PII;
const int N = 100005;
int n;
PII q[N];
int main()
{
int sum=0;
cin>>n;
for(int i=0;i<n;++i) cin>>q[i].x>>q[i].y;
sort(q,q+n);
int st=q[0].x-1,ed=st-1;让左端点st在最小区间的左边,然后让右端点在左端点左边
for(int i=0;i<n;++i)
if(ed<q[i].x)
{
sum++;
st=q[i].x;ed=q[i].y;
}
else
ed=max(ed,q[i].y);
cout<<sum;
return 0;
}
由上面两个题的st和ed取值可以看出来,st和ed的取值是要根据题意来具体分析的,不能一概而论,但有一个原则就是要让st小于最左区间的左端点值,而且ed=st-1