Ural_1303
2011-08-21 15:52
232 查看
区间覆盖问题,选取最少的线段,覆盖一个区间.
首先,区间外的线段不予考虑,按线段左点排序,从起点开始覆盖,在左点在起点左边的点中,选取右点最右的点,之后将该右点作为新的起点直至覆盖整个区间为止,如果找不到新的线段右点在起点右边,说明不能完全覆盖
首先,区间外的线段不予考虑,按线段左点排序,从起点开始覆盖,在左点在起点左边的点中,选取右点最右的点,之后将该右点作为新的起点直至覆盖整个区间为止,如果找不到新的线段右点在起点右边,说明不能完全覆盖
#include <cstdio> #include <string> #include <math.h> #include <string.h> #include <stdlib.h> #include <iostream> #include <algorithm> using namespace std; int m,p,a,b; struct xd{ int s,e; bool operator < (const xd& a)const{//按照开始坐标排序 return s<a.s; } }ss[100005]; int vis[100005];//标记是否在结果中 int main(){ p=0; memset(vis,0,sizeof vis); scanf("%d",&m); while(scanf("%d%d",&a,&b)){ if(a==0&&b==0)break; if(b<=0||a>=m||a==b)continue; ss[p].s=a,ss[p].e=b; p++; } sort(ss,ss+p); int flag=1,ed=0,pos=0,tp=0; while(ed<m){ int ned=0,ni=0; while(pos<p&&ss[pos].s<=ed){ if(ss[pos].e>ned){//在起始点在该点左边的点中,选择终止点最靠右的点 ned=ss[pos].e; ni=pos; } pos++; } if(ned==0){flag=0;break;}//没有增量,失败,退出 ed=ned;//将该点作为新的起始点并标记结果 vis[ni]=1; tp++; } if(p==0||flag==0){ printf("No solution\n"); }else{ printf("%d\n",tp); for(int i=0;i<p;i++){ if(vis[i])printf("%d %d\n",ss[i].s,ss[i].e); } } system("pause"); return 0; }
相关文章推荐
- ural 1303 Minimal Coverage【贪心】
- ural 1303 Minimal Coverage【贪心】
- ural 1303 Minimal Coverage(贪心)
- Ural 1303 Minimal Coverage
- Ural 1303 Minimal Coverage(贪心)
- URAL 1303
- 13 URAL1303 Minimal Coverage
- 贪心 URAL 1303 Minimal Coverage
- [Virtual Judge]URAL1303:Minimal Coverage
- Ural 1303 Minimal Coverage(贪心)
- URAL 1303
- URAL 1303 Minimal Coverage (贪心)
- Ural 1303 Minimal Coverage(贪心)
- URAL 1303
- URAL1303——贪心——Minimal Coverage
- 【贪心】URAL - 1303 Minimal Coverage
- Minimal Coverage(ural1303,区间贪心)
- URAL 1152. False Mirrors (记忆化搜索 状压DP)
- URAL 1427. SMS (线性dp)
- [数位dp] ural 1057 Amount of Degrees