链接:https://ac.nowcoder.com/acm/contest/392/A

题意:

月月唱歌超级好听的说!华华听说月月在某个网站发布了自己唱的歌曲,于是把完整的歌曲下载到了U盘里。然而华华不小心把U盘摔了一下,里面的文件摔碎了。月月的歌曲可以看成由1到N的正整数依次排列构成的序列,它现在变成了若干个区间,这些区间可能互相重叠。华华想把它修复为完整的歌曲,也就是找到若干个片段,使他们的并集包含1到N(注意,本题中我们只关注整数,见样例1)。但是华华很懒,所以他想选择最少的区间。请你算出华华最少选择多少个区间。因为华华的U盘受损严重,所以有可能做不到,如果做不到请输出-1。

思路:

左端点排序,从左端点最多超出当点右端点1的段中选右端点最远的。

判断是否能覆盖全部端点。

代码:

#include <bits/stdc++.h>

using namespace std;

typedef long long LL;

const int MAXN = 1e5 + 10;

struct Node
{
int _l;
int _r;
bool operator < (const Node & that) const{
return this->_l < that._l;
}
}node[MAXN]; int main()
{
int n, m;
scanf("%d%d", &n, &m);
for (int i = 1;i <= m;i++)
scanf("%d%d", &node[i]._l, &node[i]._r);
sort(node + 1, node + 1 + m);
int l = 0, r = 0, res = 0, len = 0;
int flag = 1;
for (int i = 1;i <= m;i++)
{
if (node[i]._l <= r + 1)
{
len = max(len, node[i]._r - r);
continue;
}
if (len == 0)
{
flag = 0;
break;
}
r = r + len;
len = 0;
res++;
i--;
//cout << r << endl;
if (r >= n)
{
len = 0;
break;
}
}
if (len > 0)
{
r += len;
res++;
}
if (!flag || r < n)
printf("-1\n");
else
printf("%d\n", res); return 0;
}

  

最新文章

  1. [BI项目记]-对项目文件进行规划
  2. svn 切换默认用户名
  3. 转:给自己TopCoder SRM的建议
  4. sql 练习(1)
  5. WPF:DataTemplateSelector设置控件不同的样式
  6. GoldenGate 传统抽取进程的 ADG 模式
  7. How to delete a VM with snapshots
  8. [转]Blue Prism Interview Questions and Answers
  9. SQL SERVER-创建Alwayson
  10. 浅谈static关键字的四种用法
  11. 1.Magicodes.NET框架之路——起航
  12. NOIP2012提高组 Day 2 Problem 2 借教室
  13. 在Oracle中使用Guid
  14. linux设置开机自启动
  15. django 【form表单】
  16. Java学习——Applet写字符串(调字体)
  17. .net图表之ECharts随笔05-不同01的语法步骤
  18. C# MemoryStream BinaryReader
  19. Python3 open()函数参数
  20. SparkStreaming 的编程模型

热门文章

  1. openwrt gstreamer实例学习笔记(二.gstreamer 的 Element)
  2. 【学生信息管理系统】EOF 和 BOF
  3. SpringInAction4笔记——web
  4. java 提高效率的做法
  5. WPF 之Converter
  6. 【Codeforces 947A】 Primal Sport
  7. absolute 和float
  8. background-clip与background-origin
  9. 转:深度学习与自然语言处理之五:从RNN到LSTM
  10. 斯坦福CS231n—深度学习与计算机视觉----学习笔记 课时11