方法一:使用数组标记0~l之间的数记为1,再每次重置输入区间的数为0,最后统计即可。
#include <iostream>
#include <vector>
using namespace std;
int main() {
int l,m;
cin>>l>>m;
vector<int> v(l+1,1);
for(int i=0; i<m; i++){
int a,b;
cin>>a>>b;
for(int j=a; j<=b; j++) v[j]=0;
}
int cnt=0;
for(int i=0; i<=l; i++) cnt+=v[i];
cout<<cnt<<endl;
return 0;
}
方法二:将输入的区间记录,然后排序之后逐个合并区间。
#include <iostream>
#include <algorithm>
using namespace std;
struct Area{
int begin,end;
bool operator <(Area a) const{
return begin<a.begin;
}
}a[101];//记录区间
int main(int argc, char** argv) {
int l,m;
cin>>l>>m;
for(int i=0;i<m;i++) cin>>a[i].begin>>a[i].end;
sort(a,a+m);
for(int i=0;i<m-1;i++){
for(int j=i+1;j<m;j++){
if(a[i].begin<=a[j].begin && a[j].begin<=a[i].end || a[i].begin<=a[j].end && a[j].end<=a[i].end){
a[i].begin=min(a[i].begin,a[j].begin);
a[i].end=max(a[i].end,a[j].end);
a[j].begin=-1;
}else{
i=j;
break;
}
}
}
l++;
for(int i=0;i<m;i++){
if(a[i].begin!=-1) l-=a[i].end+1-a[i].begin;
}
cout<<l<<endl;
return 0;
}