贪心算法——区间覆盖问题

爱被打了一巴掌 2022-05-09 07:08 519阅读 0赞

区间覆盖问题

数轴上有n个闭区间[ai,bi],选择尽量少的区间覆盖一条指定的线段[s,t]。

分析:

  1. 把各区间按照a从小到大排序。如果区间1的起点不是s,无解,否则起点在s的最长区间。选择\[ai,bi\]后,新的起点设置成bi。直至覆盖整个线段。

70

输入:

N:测试数据组数

begin,end:要覆盖区间的起始和终止点

n:区间数。后面跟随n个区间

输出:

覆盖的具体区间 以及 覆盖区间的总数

代码:

  1. #include<iostream>
  2. #include<algorithm>
  3. using namespace std;
  4. const int maxn=20;
  5. struct timetable
  6. {
  7. int a;
  8. int b;
  9. }time[maxn];
  10. bool comp(timetable &x,timetable &y)//多看两遍
  11. {
  12. return (x.a<y.a);
  13. }
  14. int main()
  15. {
  16. int i,j,N,n,count;
  17. int begin,end;
  18. while(cin>>N)//N表示有几组测试数据
  19. {
  20. while(N--)
  21. {
  22. cin>>begin>>end;
  23. cin>>n;//n个区间
  24. for(i=0;i<n;i++)
  25. {
  26. cin>>time[i].a;
  27. cin>>time[i].b;
  28. }
  29. sort(time,time+n,comp);//区间按照a从小到大排序
  30. count=0;
  31. int len=0,maxlen,tmp;
  32. int newbegin=begin;
  33. i=0;
  34. while(len<end-begin)
  35. {
  36. maxlen=0;
  37. for(i;i<n;i++)//找当前begin情况下最长
  38. {
  39. if(time[i].a<=newbegin)
  40. {
  41. tmp=time[i].b-newbegin;
  42. if(tmp>maxlen)
  43. {
  44. maxlen=tmp;
  45. j=i;
  46. }
  47. }
  48. else
  49. break;
  50. }
  51. if(maxlen==0)//说明断了,不存在连续覆盖
  52. {
  53. cout<<"no exit;";
  54. return 0;
  55. }
  56. cout<<"("<<time[j].a<<","<<time[j].b<<")"<<" ";
  57. len+=maxlen;
  58. count++;
  59. newbegin=time[j].b;
  60. }
  61. cout<<endl<<count<<endl;
  62. }
  63. }
  64. }

拓展阅读(挺好):

ACM知识点 之 贪心(5)最小区间覆盖问题

发表评论

表情:
评论列表 (有 0 条评论,519人围观)

还没有评论,来说两句吧...

相关阅读

    相关 贪心算法-广播台覆盖问题

    我们先看一个问题: 假设存在下面需要付费的广播台,以及广播台信号可以覆盖的地区。 如何选择最少的广播台,让所有的地区都可以接收到信号 ![在这里插入图片描述][wate

    相关 区间覆盖贪心

    题目描述 给定N个闭区间\[ai,bi\]以及一个线段区间\[s,t\],请你选择尽量少的区间,将指定线段区间完全覆盖。 输出最少区间数,如果无法完全覆盖则输出-1。