题目大意:先确定一个M, 然后输入多组线段的左端和右端的端点坐标,然后让你求出来在所给的线段中能够

把[0, M] 区域完全覆盖完的最少需要的线段数,并输出这些线段的左右端点坐标。

思路分析:

线段区间的起点是0,那么找出所有区间起点小于0中的最合适的区间。

因为需要尽量少的区间,所以选择右端点更大的区间,它包含所选线段更大。

如果在所有区间中找到了解,且右端点小于M,则把找到的区间的右端点定为新的线段区间的起点。

 #include <iostream>
#include <stdio.h>
#include <cstring>
#include <cmath>
#include <algorithm> using namespace std; struct node
{
int L, R;
}a[], b[]; bool cmp(node a, node b)
{
return a.R > b.R;
} int main()
{
int M;
while(scanf("%d", &M) != EOF)
{
int Index = ;
while()
{
scanf("%d%d", &a[Index].L, &a[Index].R);
if(a[Index].L == && a[Index].R == )
break;
++Index;
} sort(a, a+Index, cmp); int border = ; // 起始边界点为0
int cnt = ;
while(border < M)
{
int i = ;
for(; i < Index; ++i)
{
// a[i].R >= border提交将会Runtime error
if(a[i].L <= border && a[i].R > border)
{
b[cnt] = a[i];
cnt++;
border = a[i].R; // 更新边界点
break;
}
}
if(i == Index)
break;
} if(border < M)
cout << "No solution" << endl;
else
{
cout << cnt << endl;
for(int i = ; i < cnt; ++i)
cout << b[i].L << " " << b[i].R << endl;
}
} return ;
}

最新文章

  1. 求50-100内的素数(java)
  2. PHP环境搭建——Apache、Mysql、PHP单独安装(for Windows)
  3. QWidget::paintEngine: Should no longer be called
  4. ASP.NET MVC使用jQuery无刷新上传
  5. 【Hibernate】Hibernate系列8之管理session
  6. Qt中单例模式的实现(4种方法)
  7. 关于Google+以及Facebook第三方登录实现的一点总结
  8. LCA 笔记
  9. js日期相关函数总结分享
  10. oracle中的exists 和not exists 用法 in与exists语句的效率问题
  11. Android 6.0 双卡拨号
  12. 《JavaScript 闯关记》之事件
  13. UVA 562 Dividing coins(dp + 01背包)
  14. 数据类型和typeof操作符
  15. luci页面“save&amp;apply”的实现分析
  16. 勘误《iOS网络高级编程:iPhone和iPad的企业应用开发》
  17. Cocoapods 应用第一部分 - Xcode 创建 .framework 相关
  18. 201521123080《Java程序设计》第10周学习总结
  19. 一次Linux自动化部署尝试
  20. gitlab的ssh key有2个

热门文章

  1. Django之模板语言(三)------&gt;自定义filter
  2. 第一次个人项目【词频统计】——测试样例分析&amp;性能分析
  3. Ionic App 更新插件cordova-plugin-app-version
  4. 判断django中的orm为空
  5. 【踩坑】nextSibling 和nextElementSibling的区别
  6. alert提示框去掉域名
  7. 禅道Mysql默认密码修改
  8. 2019-2-19-win10-uwp-客户端如何发送类到-asp-dotnet-core-作为参数
  9. Armijo线性搜索
  10. TZ_09_自定义Spring-security