zoukankan      html  css  js  c++  java
  • 贪心问题——区间选点

    问题描述:

    数轴上有 n 个闭区间 [a_i, b_i]。取尽量少的点,使得每个区间内都至少有一个点(不同区间内含的点可以是同一个)

    Input

    第一行1个整数N(N<=100)
    第2~N+1行,每行两个整数a,b(a,b<=100)

    Output

    一个整数,代表选点的数目

    Examples

    Input
    2
    1 5
    4 6
    Output
    1
    Input
    3
    1 3
    2 5
    4 6
    Output
    2
    View Code

    解决思路:

    贪心策略:选点之前先要对区间排个序嘛,一共有两种策略

    1)左端点升序排序

    2)右端点升序排序

    贪心总是达到局部最优

    我们总是希望每个点可以覆盖到更多的点,即选择未覆盖区间的右端点选择覆盖

    如果按照 1)  那么下面这种情况则不会达到最优,舍弃。。

    如果按照 2)

    ok

     

    Code

     1 #include<iostream>
     2 #include<algorithm>
     3 using namespace std;
     4 
     5 typedef struct Node{
     6     int a,b;
     7     
     8 }node;
     9 
    10 node *interval=new node[100];
    11 bool cmp(node x,node y){
    12     if(x.b!=y.b)
    13        return x.b<y.b;
    14        
    15     return x.a>y.a;
    16 }
    17 
    18 //区间选点 
    19 /*按照终点从小到大排序
    20 int main()
    21 {
    22     int N;
    23     cin>>N;
    24     for(int i=0;i<N;i++){
    25         cin>>interval[i].a>>interval[i].b;
    26     }
    27     
    28     sort(interval,interval+N,cmp);
    29     //for(int i=0;i<N;i++)
    30     //cout<<interval[i].a<<" "<<interval[i].b<<endl;
    31     int number=1;
    32     int point=interval[0].b;
    33     for(int i=1;i<N;i++){
    34         
    35         if(point<interval[i].a)
    36         {
    37             number++;
    38             point=interval[i].b;
    39         }
    40     }
    41     cout<<number<<endl;
    42     return 0;
    43 }
    流转星云
  • 相关阅读:
    云存储研发工程师(40-50万)
    数据分析师(50-70万)
    云计算-资深java研发
    云计算 -- 资深python开发
    公众号”IT高薪猎头“
    51内核mcu实现printf的一种方法
    一种基于蓝牙BLE无线控制的灯光系统的解决方案
    Ecx后台增加新菜单+新数据表+新bundle完整过程
    Ecx 生成swagger文档
    ecshopx-manage管理后台本地编译设置本地API
  • 原文地址:https://www.cnblogs.com/liuzhuan-xingyun/p/12491549.html
Copyright © 2011-2022 走看看