【八中】区间覆盖问题
来源:互联网 发布:红色后代知乎 编辑:程序博客网 时间:2024/05/01 13:53
区间覆盖问题
时间限制: 1 Sec
内存限制: 128 MB
题目描述
数轴上有N个闭区间[Ai, Bi],选择尽量少的区间覆盖一条指定线段[S, T]。
输入
第1行:先是一个整数N(1 <= N <=10^6),然后是两个整数S和T(-10^7 <= S < T <= 10^7)
接下来N行,每行2个整数Ai,Bi(-10^7 <= Ai < Bi < 10^7)
输出
第1行:一个整数,表示最少需要的区间的个数。如果无解,输出 No Solution
样例输入
8 1 10-3 -113 160 32 63 56 105 64 10
样例输出
3
提示
一个可行的方案是选择3个区间:[0, 3], [2, 6], [4, 10]
【题目大解析】
(1)找到所有的、起点小于s的区间
(2)把这些区间按照终点,从小到大排序
(3)选择终点最大的那个区间,设这个最大的终点是bi
(4)现在问题变成了,“选择尽量少的区间覆盖一条指定线段[bi, t]”
(5)用相同的思路来解决这个(4)
#代码#
状态:正确
#include<bits/stdc++.h> using namespace std; int n,s,t; struct node { int a;int b; }a[100006]; int num; bool cmp(node s1,node s2) { if(s1.a>s2.a)return 0; else if(s1.a==s2.a) { if(s1.b<s2.b) return 0; } return 1; } int main() { scanf("%d%d%d",&n,&s,&t); for(int i=1;i<=n;i++) scanf("%d%d",&a[i].a,&a[i].b); sort(a+1,a+n+1,cmp); //for(int i=1;i<=n;i++) //printf("%d %d\n",a[i].a,a[i].b); int j=0; a[0].b=s; int maxl=0; if(a[1].a>s) { printf("No Solution"); return 0; } int x; bool f=0; while(num<n) { if(a[j].b>=t)break; for(int i=j+1;i<=n;i++) { if(a[j].b>=a[i].a) { if(a[i].b>maxl) maxl=a[i].b,f=1,x=i; } } if(f) { maxl=0; f=0; num++; j=x; } else { num=0; printf("No Solution"); return 0; } } printf("%d",num); }
阅读全文
1 0
- 【八中】区间覆盖问题
- 区间覆盖问题
- 区间覆盖问题
- 区间覆盖问题
- 区间覆盖问题
- 区间覆盖问题(sdut2074
- 区间覆盖问题
- 区间覆盖问题【贪心】
- 区间覆盖问题
- 【区间完全覆盖问题】
- 区间覆盖问题
- 区间覆盖问题 贪心
- 区间覆盖问题
- 贪心 区间覆盖问题
- 区间覆盖问题(贪心)
- 区间覆盖问题
- 区间覆盖问题
- 区间覆盖问题
- python一些关于字符串的知识
- SMTP的几个端口的比较
- TCP与UDP区别
- 1.1 图像分类:数据驱动的方法,k-近邻,划分训练集/验证集/测试集
- 明德扬FPGA-培训班公开课-第09期-《FIFO的使用技巧》
- 【八中】区间覆盖问题
- python+selenium初级(1)—控制浏览器
- TableviewCell高度自适应
- 一图搞定java类成员访问级别
- word2html & html2pdf
- nrf52832 Jlink RTT 打印调试怎样使用
- 世峰发布旅游虚拟现实VR教学平台,开创教学新模式
- appium安装步骤和环境搭建
- 2017.12.04 java输入输出流