B - 整数区间

B - 整数区间

Time Limit: 1000/1000MS (C++/Others) Memory Limit: 65536/65536KB (C++/Others)

Problem Description

一个整数区间[a,b](a < b),是一个从a到b连续整数的集合。
现在给你n个整数区间,编程找出一个集合R,使得n个集合中的每个集合都有2个整数出现在R中,并且这个集合R包含的整数个数最少。

Input

第一行包含整数n(1 <= n <= 10000),表示整数区间的个数。接下来n行,每行包含两个整数a和b(0 <= a < b <= 10000, a < b)。

Output

输出符合条件的集合R中元素的个数。

Sample Input

4
3 6
2 4
0 2
4 7

Sample Output

4

Hint

对于输入样例,我们可以找到集合R{1,2,4,5}和R{1,2,4,6},这里R的元素的个数为4.

#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;

const int maxn = 1e5+5;
struct Node{
    int x, y;
    bool operator < (const Node& b) const{ // 按照b的升序排序
        return y < b.y;
    }
}a[maxn];

int main()
{
    int n;
    scanf("%d", &n);
    for(int i=0; i<n; i++)
        scanf("%d %d",  &a[i].x, &a[i].y);

    sort(a, a+n);
    int t1 = -1, t2 = -1, cnt = 0;
    // t1 t2表示当前取的,最大的两个数 其中 t1 < t2

    for(int i=0; i<n; i++){
        bool f1 = (t1 >= a[i].x); // t1是否在当前区间
        bool f2 = (t2 >= a[i].x); // t2是否在当前区间

        if(f1 && f2) ;  // 都在 不处理
        else if(!f1 && f2) { // t1不在,t2在, 需要再加一个数,替换掉t1, 贪心的取最大的
            t1 = a[i].y;
            cnt++;      // 多需要一个数
        }
        else {          // t1 t2谁都不在,需要再加两个数,贪心地添加最大的两个数
            t1 = a[i].y - 1;
            t2 = a[i].y;
            cnt += 2;
        }
        if(t1 > t2) swap(t1, t2); //保持 t1 < t2
    }
    printf("%d\n", cnt);

    return 0;
}

原文地址:https://www.cnblogs.com/yangf428/p/10180699.html

时间: 2024-10-01 00:37:37

B - 整数区间的相关文章

整数区间

整数区间请编程完成以下任务: 1.从文件中读取闭区间的个数及它们的描述: 2.找到一个含元素个数最少的集合,使得对于每一个区间,都至少有一个整数属于该集合,输出该集合的元素个数. [输入] 首行包括区间的数目n,1<=n<=10000,接下来的n行,每行包括两个整数a,b,被一空格隔开,0<=a<=b<=10000,它们是某一个区间的开始值和结束值.[输出]第一行集合元素的个数,对于每一个区间都至少有一个整数属于该区间,且集合所包含元素数目最少.[样例输入] 4 3 6 2

1324:【例6.6】整数区间

1324:[例6.6]整数区间 时间限制: 1000 ms         内存限制: 65536 KB提交数: 1614     通过数: 1020 [题目描述] 请编程完成以下任务: 1.从文件中读取闭区间的个数及它们的描述: 2.找到一个含元素个数最少的集合,使得对于每一个区间,都至少有一个整数属于该集合,输出该集合的元素个数. [输入] 首行包括区间的数目n,1≤n≤10000,接下来的n行,每行包括两个整数a,b,被一空格隔开,0≤a≤b≤10000,它们是某一个区间的开始值和结束值.

求一个整数区间(从1到n)内1出现的次数

题目描述 求出1-13的整数中1出现的次数,并算出100-1300的整数中1出现的次数?为此他特别数了一下1~13中包含1的数字有1.10.11.12.13因此共出现6次,但是对于后面问题他就没辙了.ACMer希望你们帮帮他,并把问题更加普遍化,可以很快的求出任意非负整数区间中1出现的次数(从1 到 n 中1出现的次数). 暴力解法 比较简单的解法是从1到n顺次遍历,每遍历到一个数,依次求其每一位是否为1 //暴力法,时间复杂度是O(nlogn) // 遍历1~n,不断迭代检查各位是不是1 in

求两个整数区间的累加和(递归方法)

int main() { int n,m; int k=0; scanf("%d %d",&n,&m); k=sum(n,m); printf("%d\n",k); return 0; } int sum(int n,int m){ if(n<m){ return sum(n,m-1)+m; }else{ return n; } }

Swift语言指南(三)--语言基础之整数和浮点数

整数 整数指没有小数的整数,如42,-23.整数可以是有符号的(正数,零,负数),也可以是无符号的(正数,零). Swift提供了8,16,32,64位形式的有符号和无符号的整数,这些整数遵循与C语言相似的命名规则.如8位无符号整数的类型为UInt8,32位有符号整数的类型为Int32,和Swift语言的其它类型一样,这些整型命名以大写字母开头. 整数的边界 你可以通过min或max属性为每一个整数类型指定一个最小值或最大值: 1 let 最小值 = UInt8.min // 最小值 等于 0,

POJ1201 区间

题目大意: 给定n个整数区间[ai,bi]和n个整数ci,求一个最小集合Z,满足|Z∩[ai,bi]|>=ci(Z里边在闭区间[ai,bi]的个数不小于ci). 多组数据: n(1<=n<=50000)区间的个数 n行: ai bi ci(0<=ai<=bi<=50000,1<=ci<=bi-ai+1) _____________________________________________________ 这是一道查分约束题目. Si为0-i中包含在Z中

对于整数幂打表的一个技巧

如果我们需要在某个整数区间打一个幂表的话,有一个方法比较好用,比如我们要在1~5000之间,打满     1^1,    1^2,    1^3...............    1^5000     2^1,    2^2,    2^3...............    2^5000     3^1,    3^2.    3^3...............    3^5000     .......     ....... 5000^1,    5000^2,    5000^3, 

SQL Server中的RAND函数的介绍和区间随机数值函数的实现

    工作中会遇到SQL Server模拟数据生成以及数值列值(如整型.日期和时间数据类型)随机填充等等任务,这些任务中都要使用到随机数.鉴于此,本文将对SQL Server中随机数的使用简单做个总结 .   T-SQL 随机有关的三个函数          RAND([seed] 此函数生成从0到1之间随机 float 值(详细说明查看https://technet.microsoft.com/zh-cn/library/ms177610(v=sql.90).aspx). CHECKSUM

整数1维碰撞检测

直接两两检测是n方级别的时间复杂度,其实可以提高的.以下是一种基于排序的方法,针对1维,整数精度的情况,也就是许多整数区间中哪些相交的问题. 基本思想是对所有区间的下界和上届都混在一起进行排序,并记下每个端点的序号,如果某个区间的上界序号不是下界序号+1的话,那就说明发生了相交.在此基础上,可以二分查找和哪些个端点相交了.无碰撞情况时间复杂度是logN(快排,数量很大的话用计数基数排可以进一步降到N) + N(检查).全碰撞情况时间复杂度是logN + NlogN.这方法在时间和空间上算是做个折