• UVA10020(最小区间覆盖)


    题意:
          给你一个区间[0,m]和一些小的区间[l,r]让你选择最少的小区间个数去把整个区间覆盖起来。


    思路:
          算是比较经典的贪心题目吧(经典于难度没什么对应关系),大体思路可以是这样,我们先把所有的区间按照起点从小到大排序,然后我们定义一个当前覆盖位置pos,初始是0,也就是[0,m]的最左端,然后我们从小区间中找到一个可以覆盖pos点并且右端点最远的一个(记得sum++),然后把最远的这个右端点作为当前的pos,继续找下一个,至于实现,我是自己写的,可能写的不是很简洁,不知道网上有没有简洁点的,如果没有就讲究看下我的吧,具体细节看代码。



    #include<stdio.h>
    #include<algorithm>

    #define N 110000


    using namespace std;


    typedef struct
    {
       int l ,r;
    }EDGE;

    EDGE edge[N] ,Ans_edge[N];

    bool camp(EDGE a, EDGE b)
    {
       return a.l < b.l;
    }

    int main ()
    {
       int m ,nowid ,i ,t ,a ,b;
       scanf("%d" ,&t);
       while(t--)
       {
          scanf("%d" ,&m);
          nowid = 0;
          while(1)
          {
             scanf("%d %d" ,&a ,&b);
             if(!a && !b) break;
             if(a > m || b < 0) continue;
             ++nowid;
             edge[nowid].l = a ,edge[nowid].r = b;
          }
          sort(edge + 1 ,edge + nowid + 1 ,camp);
          int Ans = 0 ,pos = 0 ,max = 0 ,mkid = 0;
          for(i = 1 ;i <= nowid ;i ++)
          {
             if(pos > edge[i].r) continue;
             if(edge[i].l <= pos)
             {
                if(max < edge[i].r) {max = edge[i].r ,mkid = i;}
                if(i == nowid)
                {
                   if(max < m){Ans = 0 ;break;}
                   Ans_edge[++Ans] = edge[mkid];
                }   
             }
             else
             {
                if(!max){Ans = 0; break;}
                pos = max;
                max = 0 ,Ans ++ ,i --;
                Ans_edge[Ans] = edge[mkid];
                if(pos >= m) break;
             }
          }
          printf("%d " ,Ans);
          for(i = 1 ;i <= Ans ;i ++)
          printf("%d %d " ,Ans_edge[i].l ,Ans_edge[i].r);
          if(t) printf(" ");
       }
       return 0;
    }
       
          
                
                
          
          
       
       
        





  • 相关阅读:
    【ACM】nyoj_139_我排第几个_201308062046
    【ACM】poj_2356_Find a multiple_201308061947
    【ACM】hdu_zs2_1007_Problem G _201308031028
    【ACM】hdu_zs2_1006_Problem F_201308031058
    【ACM】hdu_zs2_1005_Problem E _201308030747
    【ACM】hdu_zs2_1004_Problem D _201308030856
    【葡萄城报表案例分享】项目施工进度报告 – 树形报表
    【葡萄城报表案例分享】电力设备生产数据的多层分组统计报表实现
    葡萄城报表之多维透视表 – 矩表实现商品销售对比统计
    葡萄城报表之矩表 – 现代数据分析中必不可少的报表工具
  • 原文地址:https://www.cnblogs.com/csnd/p/12062664.html
Copyright © 2020-2023  润新知