AcWing 906. 区间分组
原题链接
算法标签
贪心
思路
1.将所有区间按左端点从小到大排序
2.从前往后处理每个区间
判断能否将其放到某个现有的组中 即判断当前区间左端点大于某个现有的组的右端点L[i]> Max_ r
1.如果不存在这样的组,则开新组,然后再将其放进去;
2.如果存在这样的组,将其放进去,并更新当前组的右端点Max_r
代码
#include<bits/stdc++.h>
#define int long long
#define rep(i, a, b) for(int i=a;i<b;++i)
#define Rep(i, a, b) for(int i=a;i>b;--i)
using namespace std;
const int N = 100005;
inline int read(){
int s=0,w=1;
char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}
while(ch>='0'&&ch<='9') s=s*10+ch-'0',ch=getchar();
return s*w;
}
void put(int x) {
if(x<0) putchar('-'),x=-x;
if(x>=10) put(x/10);
putchar(x%10^48);
}
struct sec{
int l, r;
}ses[N];
int mxr[N];
bool cmp(sec A, sec B){
return A.l<B.l;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int n=read();
rep(i, 0, n){
ses[i].l=read(), ses[i].r=read();
}
sort(ses, ses+n,cmp);
int cnt=0;
rep(i, 0, n){
bool flag=false;
rep(j, 0, cnt){
if(ses[i].l>mxr[j]){
mxr[j]=max(mxr[j], ses[i].r);
flag=true;
break;
}
}
if(!flag){
cnt++;
mxr[cnt]=ses[i].r;
}
}
printf("%lld\n", cnt);
return 0;
}
原创不易
转载请标明出处
如果对你有所帮助 别忘啦点赞支持哈