题目链接:

https://vjudge.net/problem/POJ-2376

题目大意:

farmer John要安排他的牛清理牛棚,一共有T个牛棚要清理,每头牛可以清理相邻的牛棚。比如,一头牛可以清理4-7号牛棚。当然了,牛清理的牛棚可以重叠。现在要你求出可以完成牛棚的清理的最少头牛的个数,不可以就输出-1.

思路:

贪心题。题目意思很明显是求最少的区间覆盖掉大区间。先对这些时间段排好序(见代码),这个排序应该是没什么问题的。然后呢,第一头牛肯定要选,就从这头牛开始,选取下一头牛。下一头牛怎么选取呢?即在满足条件的牛里面(注意:满足条件的牛是只要开始工作时间 start>=cow[0].y+1 即可),选取右边界值最大的那个,因为这样子能够覆盖掉最多的时间段。以此类推,故贪心法求之。

 #include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<queue>
#include<vector>
using namespace std;
typedef long long ll;
int n, t;
struct node
{
int l ,r;
bool operator < (const node a)const
{
return l < a.l || l == a.l && r > a.r;
}
};
node a[];
int main()
{
while(scanf("%d%d", &n, &t) != EOF)
{
for(int i = ; i < n; i++)
{
scanf("%d%d", &a[i].l, &a[i].r);
}
sort(a, a + n);
int ans = , end = , now = ;
while(end < t)
{
int begin = end + ;
for(int i = now; i < n; i++)
{
if(a[i].l <= begin)//要覆盖起点
{
end = max(end, a[i].r);//取最远的终点
}
else
{
now = i;//不能覆盖起点,说明之后的都不可以,直接跳出,记录下标
break;
}
}
if(end < begin)//没找到牛,直接跳出
{
ans = -;
break;
}
else ans++;
}
cout<<ans<<endl;
}
return ;
}

最新文章

  1. activity 、window与view的关系 (上)
  2. 【PHP面向对象(OOP)编程入门教程】21.多态的应用
  3. git——学习笔记(三)分支管理
  4. luigi学习8--使用中央调度器
  5. Codeforces Good bye 2015 B. New Year and Old Property dfs 数位DP
  6. 利用ExpandableListView和gridview 显示可展开折叠菜单导航
  7. [C#]线程处理
  8. 捕获JSON 解析错误
  9. ImportError: No module named pysqlite2 --安装pysqlite
  10. 让 Dreamweaver 支持 Emmet(原ZenCoding)
  11. bzoj1113
  12. unity A*寻路 (二)读取NavMesh数据
  13. 深入了解GOT,PLT和动态链接
  14. 【webpack学习笔记】a01-基础构建
  15. 使用winrar自解压功能制作安装包
  16. valgrind- 内存泄漏-how to install and use
  17. SpringMVC框架项目在编译运行是常见错误
  18. oracle 视图views
  19. Java自动类型转换
  20. SQL Server 存储过程生成流水号

热门文章

  1. 搭建一个wordpress网站需要做哪些工作
  2. Storm(1)-centos7下安装单机版Strom
  3. C#学习 - 关于Interlocked.CompareExchange()的用法
  4. Problem09 求完数
  5. SpringMVC中的视图和视图解析器
  6. java编程--01介绍日期的比较
  7. Android中的下拉列表
  8. Python 参数设置
  9. PHP post &amp; get请求
  10. Powershell(1)