给出n个区间,第i个区间的左右端点是[ai,bi]。现在要在这些区间中选出若干个,使得区间[0,m]被所选区间的并覆盖(即每一个0<=i<=m都在某个所选的区间中)。保证答案存在,求所选区间个数的最小值。
输入第一行包含两个整数n和m(1<=n<=5000,1<=m<=10^9)
接下来n行,每行两个整数ai和bi(0<=ai,bi<=m)
提示:使用贪心法解决这个问题。先用O(n^2)的时间复杂度排序,然后贪心选择这些区间。
#include<iostream> using namespace std; const int MAXN=5000; int n,m; struct segment{int a,b;} A[MAXN]; void sort()//排序 { for(int i=0;i<n;i++) for(int j=1;j<n;j++) if(____(1)____) { segment t=A[j]; _____(2)_____; } } int main() { cin>>n>>m; for(int i=0;i<n;i++) cin>>A[i].a>>A[i].b; sort(); int p=1; for(int i=1;i<n;i++) if(_____(3)_____) A[p++]=A[i]; n=p; int ans=0,r=0; int q=0; while(r<m) { while(_____(4)____) q++; ________(5)______; ans++; } cout<<ans<<endl; return 0; }