#include<bits/stdc++.h>
using namespace std;
#define lint long long
int m,n;
int p[10010];
struct line{
int l,r;
bool operator<(line &aa){ //定义运算,排序将区间大的优先
if(l!=aa.l) return l<aa.l;
else return r>aa.r;
}
}a[10010];
int main(){
cin >> n >> m;
for(int i=1;i<=n;i++) cin >> p[i];
for(int i=1;i<=m;i++) cin >> a[i].l >> a[i].r;
sort(a+1,a+m+1);
int add=1,i;
for(i=1;i<=n;i++){ //i代表使用的点的个数
int maxp=0;//maxp记录最多可满足的区间数
for(int j=1;j<=n;j++){ //循环j枚举每个点
int c=0;
for(int k=add;k<=m;k++){ //前add-1个区间已经被满足,所以从add开始枚举
if(a[k].l<=p[j] && a[k].r>=p[j]) c++;
else break;
}
maxp=max(maxp,c);
}
add+=maxp;
if(add==m+1) break;
}
if(add!=m+1) {cout << -1; return 0;}
cout << i;
return 0;
}
练习19,线段和点【贪心】
于 2022-03-23 20:14:46 首次发布