NC23036 华华听月月唱歌
题目
题目描述
月月唱歌超级好听的说!华华听说月月在某个网站发布了自己唱的歌曲,于是把完整的歌曲下载到了U盘里。然而华华不小心把U盘摔了一下,里面的文件摔碎了。月月的歌曲可以看成由 到 的正整数依次排列构成的序列,它现在变成了若干个区间,这些区间可能互相重叠。华华想把它修复为完整的歌曲,也就是找到若干个片段,使他们的并集包含 到 (注意,本题中我们只关注整数,见样例1)。但是华华很懒,所以他想选择最少的区间。请你算出华华最少选择多少个区间。因为华华的U盘受损严重,所以有可能做不到,如果做不到请输出 。
输入描述
第一行两个正整数 ,表示歌曲的原长和片段的个数。
接下来 行,每行两个正整数 表示第 的片段对应的区间是 。
输出描述
如果可以做到,输出最少需要的片段的数量,否则输出 。
示例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
备注
题解
知识点:贪心,排序。
显然,找到左端点处于已连接部分,右端点能到达最远距离为某次的最优解。因此,考虑从小到大排列左端点,每次右端点 扩展最远距离,直到左端点离开上一次的右端点 的位置(加一是因为区间链接不需要端点重合,因此加一位置也是可以连接点),更新 ,进行下一次扩展,直到 即为拼接成功。如果某次扩展完毕的 ,说明无法继续扩展直接跳出。最后判 即可。
时间复杂度
空间复杂度
代码
#include <bits/stdc++.h> using namespace std; pair<int, int> a[100007]; int main() { std::ios::sync_with_stdio(0), cin.tie(0), cout.tie(0); int n, m; cin >> n >> m; for (int i = 0;i < m;i++) cin >> a[i].first >> a[i].second; sort(a, a + m); int i = 0, last = 0, now = 0, ans = 0; while (last < n) { while (i < m && a[i].first <= last + 1) { now = max(now, a[i].second); i++; } if (now > last) { last = now; ans++; } else break; } if (last == n) cout << ans << '\n'; else cout << -1 << '\n'; return 0; }
本文来自博客园,作者:空白菌,转载请注明原文链接:https://www.cnblogs.com/BlankYang/p/16380473.html
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧