【题目大意】

给出几个小区间和大区间,求覆盖整个大区间的最少小区间个数,如果不可能则输出-1。

【思路】

这道程序写得我很不爽快,迷迷糊糊写完了,提交一遍AC了,可是我自己都没怎么弄懂到底是怎么写出来的(我果然不是很擅长贪心的实现)。思路很简单,显而易见地贪心,关键在于如何实现这个思路。

先以区间左边界为关键字进行排序,每次选左边界能与上一个右边界相接的区间中右边界最大的那一个。我的实现方法是这样的:假设当前已经覆盖区域的右边界为lright,之前能覆盖到的最大右边界为p,ans为需要的小区间数。对于每一个小区间:

(1)如果它的左边界已经大于lright+1,即p已经是能与上一个右边界相接的区间中右边界最大的那一个,将lright更新为p,p初始化为-1,ans+1;当然,如果p本身就是-1,说明无法与已覆盖区域连接,无解(当然无解的情况并不仅限于这一种,还有可能是无法覆盖到大区间的右边界等),可以直接退出循环。

(2)如果当前左边界小于等于lright+1,且右边界大于等于lright+1,在当前右边界和p中选取较大的一个;如果p恰好大于等于大区间的右边界,ans+1,退出循环。

要注意的一点事,所谓衔接不是[0,1][1,2]这样首尾相接,而是[0,1][2,3]即可。

 #include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
const int MAXN=+;
struct interval
{
int left,right;
bool operator < (const interval &x) const
{
return (left<x.left);
}
}; int n,t;
interval cow[MAXN]; int main()
{
scanf("%d%d",&n,&t);
for (int i=;i<n;i++)
scanf("%d%d",&cow[i].left,&cow[i].right);
sort(cow,cow+n); int lright=,ans=,p=-;
for (int i=;i<n;i++)
{
if (cow[i].left>lright+)
{
if (p==-) break;
/*如果当前左边界已经大于之前的最大右边界,且没有中间区间能衔接,必定说明无解*/
ans++;
lright=p;
p=-;
/*否则将已经覆盖区域的右边界设为之前最大的右边界*/
}
if (cow[i].left<=lright+ && cow[i].right>=lright+)
{
p=max(p,cow[i].right);
if (p>=t)
{
ans++;
break;
/*如果当前已经覆盖完大区间,就退出*/
}
}
}
if (p>=t) cout<<ans<<endl;
else cout<<-<<endl;
return ;
}

最新文章

  1. Dean-Edward的事件系统实现
  2. [java] 深入理解内部类: inner-classes
  3. js 处理 html 标签转义 处理json中含有的ascii 编码
  4. java中如何将字符串数组转换成字符串(转)
  5. 闭包的理解-from my own opinion
  6. Windows 8.1 应用再出发 - 几种更新的控件
  7. xml 解析 java 基础复习
  8. C语言实现单向链表及其各种排序(含快排,选择,插入,冒泡)
  9. Java 异常处理机制和集合框架
  10. C++中不可重载的5个运算符
  11. 配置Log4j(非常具体)
  12. hdu 4454 Stealing a Cake
  13. Android 模仿QQ空间风格的 UI(转)
  14. date用法
  15. 动态规划1-----------poj1080
  16. Android NDK开发之从环境搭建到Demo级十步流
  17. 无法启动 IIS Express Web 服务器
  18. php 实现简拼
  19. 2016年蓝桥杯省赛A组c++第4题(算法填空)
  20. python爬虫相关基础概念

热门文章

  1. jQuery mobile 滑动打开面板
  2. 【转】ps命令详解
  3. arping详解
  4. Centos 7 smb 安装使用
  5. device tree 負值 property 寫法
  6. 從 kernel source code 查出 版本號碼
  7. Centos_Lvm_Create pv vg lv and mount
  8. 【HDU3037】Saving Beans
  9. 【LabVIEW技巧】LabVIEW中的错误2
  10. python manage.py 命令