• 贪心法:选择不相交区间(区间选点问题)


    为啥把这两个问题放在一起?因为这两个问题可以用同样的程序来实现!!

    请注意刘汝佳算法竞赛入门经典在进行区间选点问题的讨论时,有一句话没有任何意义:b相同时a从大到小排序

    因为排不排结果没有任何区别

    程序实现的思路是把所有的边按照右端点从小到大排序

    设置一个tmp初值为极小值,然后考虑每一条边,每次都拿这条边的左端点和tmp进行比较

    如果当前边左端点的值大于tmp,就将当前边右端点的值赋值给tmp,同时结果+1

    再阐述一下刚才的两个问题

    选择不相交区间:选择尽量多的区间使得这些区间两两没有公共点

    区间选点问题:选择尽量少的点使得每个区间内都至少有一个点

    这两个问题都可以用上述程序实现~

    代码如下:

     1 #include<iostream>
     2 #include<algorithm>
     3 using namespace std;
     4 const int maxn=1005;
     5 struct Extent
     6 {
     7     int l,r;
     8 }e[maxn];
     9 int n;
    10 bool cmp(Extent x,Extent y)
    11 {
    12     return x.r<y.r;
    13 }
    14 int ans=0;
    15 int main()
    16 {
    17     cin>>n;
    18     for(int i=1;i<=n;i++)
    19     {
    20         cin>>e[i].l>>e[i].r;
    21         if(e[i].l>e[i].r)
    22             swap(e[i].l,e[i].r);
    23     }
    24 
    25     sort(e+1,e+n+1,cmp);
    26     int tmp=-1;
    27     for(int i=1;i<=n;i++)
    28     {
    29         if(e[i].l>tmp)
    30         {
    31             tmp=e[i].r;
    32             ans++;
    33         }
    34     }
    35     cout<<ans<<endl;
    36     return 0;
    37 }
  • 相关阅读:
    1869六度分离
    1162Eddy's picture
    hdu2544
    3549Flow Problem
    1272小希的迷宫
    2112HDU Today(Dijkstra)
    1878欧拉回路
    hdu1116Play on Words
    2112HDU Today(SPFA)
    在程序中动态创建视图
  • 原文地址:https://www.cnblogs.com/aininot260/p/9272930.html
Copyright © 2020-2023  润新知