华华听月月唱歌(贪心)
作者:互联网
链接:https://ac.nowcoder.com/acm/contest/392/A
来源:牛客网
输入描述:
第一行两个正整数N、M,表示歌曲的原长和片段的个数。
接下来M行,每行两个正整数L、R表示第i的片段对应的区间是[L,R]。
输出描述:
如果可以做到,输出最少需要的片段的数量,否则输出-1。示例1
输入
复制4 2 1 2 3 4
输出
复制2示例2
输入
复制4 2 1 1 3 4
输出
复制-1示例3
输入
复制10 5 1 1 2 5 3 6 4 9 8 10
输出
复制4
备注:
1≤L≤R≤1e9,1≤N≤1e9,1≤M≤1e5
题目大意:就是说给你一些区间,问最少需要多少个区间能把[1,n]这个区间覆盖
贪心思路:就是按照左端点拍个序,然后不断跟新右端点
#include <cstdio> #include <cstring> #include <iostream> #include<algorithm> using namespace std; int n,m; const int maxn=1e5+100; struct node{ int l,r; }q[maxn]; bool cmp(node x,node y){ return x.l<y.l; } int main(){ cin>>n>>m; for(int i=1;i<=m;i++){ cin>>q[i].l>>q[i].r; } sort(q+1,q+m+1,cmp); if(q[1].l!=1){ cout<<-1<<endl; return 0; } int last=0,maxr=0,dis=0,ans=0; for(int i=1;i<=m;){ while(q[i].l<=dis+1&&i<=m){ maxr=max(maxr,q[i].r); i++; } if(maxr>dis){ ans++; dis=maxr; } else{ ans=-1; break; } if(maxr>=n){ break; } } cout<<ans<<endl; }
标签:输出,华华,10,int,区间,include,唱歌,贪心 来源: https://www.cnblogs.com/lipu123/p/14337222.html