• 线段覆盖


    D14556. 线段覆盖

    时间限制1.0s   内存限制256.0MB

    输入文件名:test.in   输出文件名:test.out

    问题描述

      给定x轴上的N(0 < N < 100)条线段。每个线段由它的两个端点a_i和b_i确定,i=1,2,……,N。这些坐标都是区间(-999,999)的整数。有些线段之间会相互交叠或覆盖。请你写一个 程序,从给出的线段中去掉尽量少的线段,使得剩下的线段两两之间没有内部公共点。所谓内部公共点是指一个点同时属于两条线段至少在其中一条线段的内部(即除去端点的部分)。输入格式

      一个整数N。接下来有N行,每行有两个空格隔开的整数,表示一条线段的两个端点的坐标。

    输出格式

      一行:是一个整数表示最多剩下的线段数。

    样例输入

    3
    6 3
    1 3
    2 5

    样例输出

    2

    思路:

    与活动选择没有本质上的区别,只是多了一些细节处理。

    读入时左右端点非有序,要自己排一下。

    然后根据右端点大小排序,判断冲突与选择,此处段点可以相等,统计出解。

    证明略。

    注意由于坐标所在区间(-999,999),所以右端点的限值起始赋为-1000.

     

    Code:

    #include<bits/stdc++.h>
    
    #define e first
    
    #define b second
    
     
    
    using namespace std;
    
     
    
    int n, ans = 0;
    
    pair <int, int> line[110];
    
     
    
    int main(){
    
            freopen("test.in","r",stdin);
    
            freopen("test.out","w",stdout);
    
            cin >> n;
    
            for (int i = 1; i <= n; i++) {
    
                  int x, y;
    
                  cin >> x >> y;
    
                  line[i].b = min(x, y);
    
                  line[i].e = max(x, y);
    
           }
    
            sort(line + 1, line + n + 1);
    
            int last = -1000;//划重点,题目中坐标范围-999~999,起始结束时间要为-1000以下。
    
            for (int i = 1; i <= n; i++) {
    
                    if (line[i].b >= last) {
    
                            ans++;
    
                            last = line[i].e;
    
                    }
    
            }
    
            cout << ans << endl;
    
            return 0;
    
    }
  • 相关阅读:
    两数之和
    输入一个int型数据,计算出该int型数据在内存中存储时1的个数。
    MySQL事务机制(Transaction)
    JAVA 之 深入理解String类
    MySQL 之 SQL练习
    python常用函数及循环
    python多版本配置pyenv
    ES6语法的简单示例
    学习笔记190—利用matlab求解方程组的解
    学习笔记189—pandas 获取Dataframe元素值的几种方法
  • 原文地址:https://www.cnblogs.com/sun915/p/9494269.html
Copyright © 2020-2023  润新知