贪心 区间覆盖问题
2016-07-26 10:45
274 查看
问题描述:给定一个长度为m的区间,再给出n条线段的起点和终点(注意这里是闭区间),求最少使用多少条线段可以将整个区间完全覆盖
样例:
区间长度8,可选的覆盖线段[2,6],[1,4],[3,6],[3,7],[6,8],[2,4],[3,5]
解题过程:
1将每一个区间按照左端点递增顺序排列,拍完序后为[1,4],[2,4],[2,6],[3,5],[3,6],[3,7],[6,8]
2设置一个变量表示已经覆盖到的区域。再剩下的线段中找出所有左端点小于等于当前已经覆盖到的区域的右端点的线段中,右端点最大的线段在加入,直到已经覆盖全部的区域
3过程:
假设第一步加入[1,4],那么下一步能够选择的有[2,6],[3,5],[3,6],[3,7],由于7最大,所以下一步选择[3,7],最后一步只能选择[6,8],这个时候刚好达到了8退出,所选区间为3
题意是:给n个闭区间[ai,bi],选择尽量少的区间覆盖一条指定的线段[s,t]
下面是我写的代码:
思路: 在这里呢我默认的s为1,代码中的m便是区间的长度,我们先对n个区间的左端点递增排序,左端点相等的时候,右端垫递增排序,由于sum的值既可以赋值为1,也可以赋值为0,所以需要用flag来标记,定义一个变量r,r的初值为下标为0的右端点,从第二个开始取,如果当前的ai比上一个取的区间bi小,记录当前的bi,选择最大的bi,所占的区间,更新r,直到
r>=m;
样例:
区间长度8,可选的覆盖线段[2,6],[1,4],[3,6],[3,7],[6,8],[2,4],[3,5]
解题过程:
1将每一个区间按照左端点递增顺序排列,拍完序后为[1,4],[2,4],[2,6],[3,5],[3,6],[3,7],[6,8]
2设置一个变量表示已经覆盖到的区域。再剩下的线段中找出所有左端点小于等于当前已经覆盖到的区域的右端点的线段中,右端点最大的线段在加入,直到已经覆盖全部的区域
3过程:
假设第一步加入[1,4],那么下一步能够选择的有[2,6],[3,5],[3,6],[3,7],由于7最大,所以下一步选择[3,7],最后一步只能选择[6,8],这个时候刚好达到了8退出,所选区间为3
题意是:给n个闭区间[ai,bi],选择尽量少的区间覆盖一条指定的线段[s,t]
下面是我写的代码:
思路: 在这里呢我默认的s为1,代码中的m便是区间的长度,我们先对n个区间的左端点递增排序,左端点相等的时候,右端垫递增排序,由于sum的值既可以赋值为1,也可以赋值为0,所以需要用flag来标记,定义一个变量r,r的初值为下标为0的右端点,从第二个开始取,如果当前的ai比上一个取的区间bi小,记录当前的bi,选择最大的bi,所占的区间,更新r,直到
r>=m;
#include<stdio.h> #include<iostream> #include<algorithm> using namespace std; struct node { int x,y; }s[120]; bool cmp(node a,node b) { if(a.x==b.x) return a.y<b.y; return a.x<b.x; } int main() { int n,len; int i,j; while(~scanf("%d %d",&n,&len)) { for(i=0;i<n;i++) { scanf("%d %d",&s[i].x,&s[i].y); } sort(s,s+n,cmp); for(i=0;i<n;i++) printf("%d %d\n",s[i].x,s[i].y); int max=0,cnt=0,flag=1; int r=s[0].y,w; if(r>=len) { flag=0; } for(i=1;i<n;i++) { if(s[i].x<=r&&s[i].y>=r) { w=s[i].y; if(w>max) {max=w,j=i;} if(s[i].y>=len&&s[0].x>=s[i].x) {flag=0; r=max; break; } else if(s[i].y>=len&&s[0].x<=s[i].x) { flag=0; cnt++; r=max; break; } } else if(s[i].x>r) { if(s[i].x<=s[j].y) {r=max; cnt++;} else { break; } if(s[i].y>=r) { r=s[i].y; cnt++; } if(r>=len) { flag=0; break; } } } if(flag==1) printf("%d\n",cnt); if(flag==0) printf("%d\n",++cnt); } return 0; }
相关文章推荐
- 关于图片分辨率
- GitLab安装后修改IP/域名
- [Cordova/Phonegap] Cordova iOS 应用在第三方输入法的键盘弹出(点击输入框)时,页面不上移,导致输入框被键盘遮挡 的解决办法
- Volley XMLRequest GsonRequest 笔记
- POJ【3411】——Hie with the Pie
- 从内核的角度看linux文件系统以及一些类似于mount命令的原理(未完)
- ECMAScript 6
- 中国剩余定理
- 移动开发中的仿真器与模拟器
- PostCSS一种更优雅、更简单的书写CSS方式
- SVN clean up问题
- 中国剩余定理
- Yii2注册js文件
- 【Mr.he原创】旅行
- java里的编码
- HDU-3746 Cyclic Nacklace(kmp专题)
- HDU 3240 Counting Binary Trees [卡特兰数] 【数论+组合数学】
- 安装APK时报“解析错误”
- C#和Java有什么区别和联系
- JAVA 命令参数详解:-D