Minimal coverage (贪心,最小覆盖)
2024-09-06 13:54:56
题目大意:先确定一个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 ;
}
最新文章
- 求50-100内的素数(java)
- PHP环境搭建——Apache、Mysql、PHP单独安装(for Windows)
- QWidget::paintEngine: Should no longer be called
- ASP.NET MVC使用jQuery无刷新上传
- 【Hibernate】Hibernate系列8之管理session
- Qt中单例模式的实现(4种方法)
- 关于Google+以及Facebook第三方登录实现的一点总结
- LCA 笔记
- js日期相关函数总结分享
- oracle中的exists 和not exists 用法 in与exists语句的效率问题
- Android 6.0 双卡拨号
- 《JavaScript 闯关记》之事件
- UVA 562 Dividing coins(dp + 01背包)
- 数据类型和typeof操作符
- luci页面“save&;apply”的实现分析
- 勘误《iOS网络高级编程:iPhone和iPad的企业应用开发》
- Cocoapods 应用第一部分 - Xcode 创建 .framework 相关
- 201521123080《Java程序设计》第10周学习总结
- 一次Linux自动化部署尝试
- gitlab的ssh key有2个
热门文章
- Django之模板语言(三)------>;自定义filter
- 第一次个人项目【词频统计】——测试样例分析&;性能分析
- Ionic App 更新插件cordova-plugin-app-version
- 判断django中的orm为空
- 【踩坑】nextSibling 和nextElementSibling的区别
- alert提示框去掉域名
- 禅道Mysql默认密码修改
- 2019-2-19-win10-uwp-客户端如何发送类到-asp-dotnet-core-作为参数
- Armijo线性搜索
- TZ_09_自定义Spring-security