• 最小区间覆盖问题


    给你一段区间1~t,有n个区间,求能覆盖完1~t的区间的最小个数,如果不能覆盖完输出-1

    例题:poj2376

    我们先假设已经覆盖了区间a~b,那么我们选择下一个区间的时候,为了保证最贪心的取,肯定会取左端点>=b+1的区间,这样重叠浪费的就少

    然后我们再按贪心的思想,肯定是右端点越长覆盖的越多

    那么我们现在开始思考这个问题

    先按左端点从小到大排序,如果左端点相同的话按右端点从左到右排序

    然后我们先判断第一个区间

    如果第一个区间的左端点大于1 的话说明不能覆盖完1~t,直接输出-1

    否则的话,last表示已经覆盖的区间的下标,我们把最原始的区间的下标last设为1,记录区间个数的变量flag设为1

    然后我们从i=2开始遍历,当第i个区间的左端点<=last的右端点+1,并且第i个区间的右端点大于last的右端点的话,我们就从i开始找右端点最长的区间

    找到之后个数++,i变化一下

    最后判断一下已覆盖的区间last的右端点是否大于等于t,如果是就输出个数,如果不是说明没有覆盖完全,输出-1

    1. /*
    2. .----------------. .----------------. .----------------. .----------------.
    3. | .--------------. || .--------------. || .--------------. || .--------------. |
    4. | | ________ | || | _________ | || | ____ ____ | || | ____ | |
    5. | | |_ ___ `. | || | |_ ___ | | || ||_ \ / _|| || | .' `. | |
    6. | | | | `. \ | || | | |_ \_| | || | | \/ | | || | / .--. \ | |
    7. | | | | | | | || | | _| _ | || | | |\ /| | | || | | | | | | |
    8. | | _| |___.' / | || | _| |___/ | | || | _| |_\/_| |_ | || | \ `--' / | |
    9. | | |________.' | || | |_________| | || ||_____||_____|| || | `.____.' | |
    10. | | | || | | || | | || | | |
    11. | '--------------' || '--------------' || '--------------' || '--------------' |
    12. '----------------' '----------------' '----------------' '----------------'
    13. */
    14. #include
    15. #include
    16. #include
    17. #include
    18. #include
    19. #include
    20. #include
    21. #include
    22. #include
    23. #define int long long
    24. #define lowbit(x) x&(-x)
    25. #define PI 3.1415926535
    26. #define endl "\n"
    27. using namespace std;
    28. typedef long long ll;
    29. typedef pair<int,int> pii;
    30. int gcd(int a,int b){
    31. return b>0 ? gcd(b,a%b):a;
    32. }
    33. const int N=25000+10;
    34. /*
    35. int dx[8]={-2,-2,-1,1,2,2,-1,1};
    36. int dy[8]={-1,1,2,2,1,-1,-2,-2};
    37. int dx[4]={0,-1,0,1};
    38. int dy[4]={-1,0,1,0};
    39. int dx[8]={-1,1,0,0,-1,-1,1,1};
    40. int dy[8]={0,0,-1,1,-1,1,-1,1};
    41. */
    42. struct name{
    43. int l,r;
    44. }q[N];
    45. int n;
    46. bool cmp(name a,name b){
    47. if(a.l !=b.l )return a.l <=b.l ;
    48. return a.r <=b.r ;
    49. }
    50. void sove(){
    51. int t;
    52. cin>>n>>t;
    53. for(int i=1;i<=n;i++){
    54. cin>>q[i].l >>q[i].r ;
    55. }
    56. sort(q+1,q+1+n,cmp);
    57. if(q[1].l >1){
    58. cout<<-1<
    59. return ;
    60. }
    61. int flag=1,last=1;
    62. for(int i=2;i<=n;i++){
    63. if(q[i].l <=q[last].r +1&&q[i].r >q[last].r ){
    64. int j=i;
    65. while(q[i].l <=q[last].r +1&&i<=n){
    66. if(q[i].r >q[j].r ){
    67. j=i;
    68. }
    69. i++;
    70. }
    71. i=j;
    72. last=j;
    73. flag++;
    74. if(q[last].r >=t)break;
    75. }
    76. }
    77. if(q[last].r
    78. cout<<-1<
    79. }else cout<
    80. }
    81. signed main(){
    82. ios::sync_with_stdio(false);
    83. cin.tie() ,cout.tie() ;
    84. int t=1;
    85. // cin>>t;
    86. while(t--){
    87. sove();
    88. }
    89. return 0;
    90. }

  • 相关阅读:
    [自制操作系统] 第19回 实现用户进程(下)
    [Linux] PXE批量装机
    硬件设计哪些事-PCB设计那些事
    修改CentOS默认mail发件名称
    VScode默认输出到调试控制台如何调整到终端以及两者中的乱码问题
    【Vite】Vite配置文件中的插件学习
    BUG管理工具的使用及测试流程有哪些?
    浅谈自旋锁和JVM对锁的优化
    【小爱学大数据】FlinkKafkaConsumer
    【Python脚本进阶】2.4、conficker蠕虫(上):Metasploit攻击Windows SMB服务
  • 原文地址:https://blog.csdn.net/qq_61903556/article/details/126141245