首页 > 其他分享 >poj 1716 Integer Intervals (贪心)

poj 1716 Integer Intervals (贪心)

时间:2023-07-18 19:38:53浏览次数:47  
标签:int 元素 Selem Eelem Intervals poj 区间 Integer 集合


题意:给定n个连续的区间,求一个集合。其中,n个区间的每一个区间都至少包含两个这个集合的元素。求这个集合元素的最小值。

 

题解:

1、先将所有区间按终点从小到大排序。

2、我们先取第一个区间(排好序的区间)的两个值,因为要使得结果最优,我们肯定选择最接近终点的那两个值。假设一个为Selem,一个为Eelem.此时,集合元素为ans = 2.

3、看下一个区间。如果这个区间的起点要小于等于Selem,那么我们可以肯定这个区间是不用计算的,因为它和之前的区间重合的部分大于两个元素,所以跳过之。

如果这个区间的起点要小于等于Eelem但是大于Selem,那么可以知道,之前的区间包括了Selem和Eelem,但是当前这个区间只包含了Eelem(只要包含了Selem和Eelem就是包含了两个集合的元素,因为Selem和Eelem属于集合),所以我们要为当前这个区间还要加一个元素,这个元素根据最优性考虑,当然是此时区间的最后一个元素最好。故我们调整一下Selem和Eelem两个值,使得其为最后两个加进集合的元素。集合元素ans++.

现在还有一种情况就是,如果当前区间的起点大于Eelem,那么可以知道,当前的区间没有包含一个集合的元素,那么我们就要在集合里加上两个元素,这两个元素当然是当前区间的最后两个最好,根据最优性原则。然后我们再更新Selem和Eelem的值即可。集合元素ans += 2.

4、输出ans即可。

 

代码:

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

#define MAXN 10010

struct line{
    int s,t;
    bool operator < (const line & q)const{
        return t < q.t;
    }
}p[MAXN];

int main(){
    int n,m,ans, k, i, a, b;
    int Selem,Eelem;
    while(~scanf("%d",&n)){
        for(int i = 0; i < n ; i++){
            scanf("%d%d",&p[i].s,&p[i].t);
        }
        sort(p,p+n);
        for(int i = 0; i < n ; i++){
            printf("%d %d\n",p[i].s,p[i].t);
        }
        ans = 2;
        Selem = p[0].t - 1;
        Eelem = p[0].t;
        for(int i = 1; i < n; i++){
            if(p[i].s<= Selem){
                continue;
            }
            else if(p[i].s <= Eelem){
                Selem = Eelem;
                Eelem = p[i].t;
                ans ++;
                continue;
            }
            else {
                ans += 2;
                Selem = p[i].t - 1;
                Eelem = p[i].t;
                continue;
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}

 

标签:int,元素,Selem,Eelem,Intervals,poj,区间,Integer,集合
From: https://blog.51cto.com/u_16192154/6767436

相关文章

  • poj 1844 sum (数学)
    题意:给出一个数S,从1到N个数,每个数前面可以是负号或者是正号,这样累加起来,结果可以等于S,问最小的N是多少。题解:因为从1一直加到n的值(假设为sum(n))等于sum的n是最小的。所以我们先算出sum(n)大于等于sum的那个n。这样我们可以得出一个值m=sum(n)-sum.如果m==0那么n就是我们要求的......
  • poj 2311 Cutting Game (sg函数)
    小记:这题是对sg函数的初步理解。对于sg函数只要g[x]==0,则此时为必败态。x作为后继,我们就要对所有的后继进行标记,然后mex之。因为每次只能切一刀,所以切完之后,会有两块方格,而对每一块方格进行游戏又会有一个sg函数值,所以根据sg函数的性质,它这一刀所代表的后继,即为这两块方格的sg函......
  • poj 1632 Vase collection
    题意:有n个花瓶,每个花瓶都带有两种属性-形状和颜色,而每种属性都有36种不同的状态。求最大的k,使得k*k个花瓶的形状和颜色都有k种状态,且k*k个花瓶的两种属性都是由形状和颜色的k种状态组合而成的。题解:我们用一个数组(comb[])存放形状和颜色,数组的下标为形状,然后将颜色状态压缩成为数组......
  • poj 1777 Vivian's Problem
    题意:给出K个数,p1,p2,……pk,不一定是素数,给这些数添加指数,0-10之间,最终的乘积为n,他的所有因子和为m,问是否存在一个m为2的幂,如果有多个输出最大的指数,如果没有输出NO。梅森素数 我们把满足E=2^i-1的素数E称作梅森素数。关于梅森素数,有一个重要的定理:“一个数能够写成几个......
  • POJ 1410 Intersection
    判断线段与多边形是否相交。模板:#include<stdio.h>#include<math.h>#include<algorithm>usingnamespacestd;#definePi3.14159265358979#definePRECISION1e-8//点typedefstruct{doublex,y;}POINT;//直线两点的表达structLINE{POINTp1,p2;};......
  • Integer和int为什么在-128-127之间比较会相等
    原因:因为在Integer.class文件中,有一个静态内部类IntegerCache;会在系统加载时,将(low=-128到h=127)之间的数据提前包装成Integer对象放入数组cache中;inta=111l;Integerc=111l;System.out.println(a==c);//在次会发生自动的装箱,将a转换成Integer在对比字节码文件可......
  • java bean、EJB、POJO区别
    JavaBean、EJB、POJO区别在Java开发中,我们经常会听到三个词,JavaBean、EJB和POJO。它们在Java开发中有着不同的角色和用法。本文将详细介绍它们的区别,并给出相关的代码示例。JavaBeanJavaBean是一种Java语言规范,用于描述一种可重用的组件。它是一种特殊的类,遵循一些特定的命......
  • [oeasy]python0072_整数类型_int_integer_整型变量
    帮助手册回忆上次内容 上次了解的是字符串字符串就是字符的串字符串长度可以用len函数字符可以用下标索引[] 可以用str将整型数字转化为字符串 字符的长度本身有长有短ascii字符集包括各种转义字符都对应1个字节......
  • mybatis if标签判断Integer类型的值不等于0 (!=''等价于!=0)
    场景当传入的activityInfoDTO属性codeAction的值为0时,需要通过状态(code_action=0或1)来查询数据,code_action类型为Integer<iftest="activityInfoDTO.codeAction!=nullandactivityInfoDTO.codeAction!=''">andcode_action=#{acti......
  • POJ3468 A Simple Problem with Integers
    ASimpleProblemwithIntegers题目链接:ASimpleProblemwithIntegers题意给定\(N\)个数,可以选择\([l,r]\),让下标在区间内的值都增加一定值,或者输出下标在区间内元素的和。思路可以用带懒标记的线段树写,但是代码太长,不利于编写。这里有一个利用差分借助树状数组实现的写法......