• ACM 找点


    找点

    时间限制:2000 ms  |  内存限制:65535 KB
    难度:2
     
    描述

    上数学课时,老师给了LYH一些闭区间,让他取尽量少的点,使得每个闭区间内至少有一个点。但是这几天LYH太忙了,你们帮帮他吗?

     
    输入
    多组测试数据。
    每组数据先输入一个N,表示有N个闭区间(N≤100)。
    接下来N行,每行输入两个数a,b(0≤a≤b≤100),表示区间的两个端点。
    输出
    输出一个整数,表示最少需要找几个点。
    样例输入
    4
    1 5
    2 4
    1 4
    2 3
    3
    1 2
    3 4
    5 6
    1
    2 2
    样例输出
    1
    3
    A

    本题贪心算法区间选点,主要考虑题目中是闭区间,故像区间[1,2]和区间[2,3]只需要一个点,注意要不断跟新先前的区间,特别像
    [1,5]
    [2,3]
    [6,7]
    其中[6,7]先前区间为[2,3],即为以前区间的交集

    #include <iostream>
    #include <vector>
    #include <utility>
    #include <algorithm>
    using namespace std;
    typedef pair<int,int> Segment;
    bool cmp(const Segment& a, const Segment& b){
        if(a.first!=b.first) return a.first < b.first;
        else return a.second < b.second;
    }
    int main(){
        int n;
        while(cin >>n ){
            vector<Segment> segments(n);
            for(int i = 0 ; i < n; ++i){
                int x1,x2;
                cin >>x1 >>x2;
                segments[i] = Segment(x1,x2);
            }
            sort(segments.begin(),segments.end(),cmp);
            int res = 1;
            Segment prev = segments[0];
            for(int i = 1; i < n; ++ i){
                if(segments[i].first> prev.second){
                     res++;
                    prev = segments[i];
                }else if(segments[i].second < prev.second){
                    prev.second = segments[i].second;
                }
            }
            cout<<res<<endl;
        }
    }
    
    
    
     
  • 相关阅读:
    优化索引的常用思路
    MySQL架构说明
    Mysql性能分析必备知识
    查询截取分析
    Mysql之explain
    MyISAM和InnDB的区别
    sql执行顺序(面试常见)
    一个ES设置操作引发的“血案”
    Ubuntu 安装搜狗拼音输入法
    ubuntu 安装SecoClient x64
  • 原文地址:https://www.cnblogs.com/xiongqiangcs/p/3654340.html
Copyright © 2020-2023  润新知