原题
参考
解题思路
①先按照开始时间从小到大排序 可以利用pair 默认对first进行升序排序
②选择开始节点在上一区间范围内结束节点大的区间
当当前已覆盖位置pos<t&&当前进行判断的pair元素下标i<n时继续循环
退出条件:有一段覆盖不到 即当前判断的pair元素s[i].first>pos+1
第二重循环:更新最晚结束的位置(注意pos不能随之改变 应建立temp)
AC代码
//选择开始节点在上一区间范围内结束节点大的区间
#include<iostream>
#include<cstdio>
#include<algorithm>
#define MAX_N 25000
using namespace std;
int n,t;
pair<int,int> s[MAX_N];
void solve(){
sort(s,s+n);
if(s[0].first>1){
printf("-1\n");
return;
}
int ans=0,pos=0,i=0;
while(pos<t&&i<n){
int temp=pos;
if(s[i].first>pos+1)
break;
while(s[i].first<=pos+1&&i<n){//外层每循环一次只改变一次pos 所以int temp
temp=max(temp,s[i].second);
i++;
}
ans++;
pos=temp;
}
if(pos<t)
printf("-1\n");
else
printf("%d\n",ans);
return;
// fclose(stdin);
// fclose(stdout);
}
int main(){
// freopen("in.txt","r",stdin);
// freopen("out.txt","w",stdout);
scanf("%d %d",&n,&t);
for(int i=0;i<n;i++)
scanf("%d %d",&s[i].first,&s[i].second);
solve();
return 0;
}
总结
秃了才能变强 这题自己做了一天都没做出来 看了大佬的代码拨云见日 小陈仍需努力