UVA-1617 Laptop (贪心)

题目大意:有n条长度为1的线段,n个区间,第i条线段在第i个区间中,问线段之间的最少间隙有几个。

题目分析:先对区间排序,先按右端点排,再按左端点排。有重叠的区间(仅有交点重叠也视为重叠)之间一定可以摆不出空隙来。贪心策略:每碰到一个新的区间(与前面区间没有任何重叠),则把线段放到该区间最后一个长度为1的位置,如果不是新区间则可以直接忽略。

代码如下:

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

struct Q
{
    int l,r;
    bool operator < (const Q &a) const {
        if(r==a.r)
            return l<a.l;
        return r<a.r;
    }
};
Q a[100005];

void solve(int n)
{
    int ans=0,p=-1;
    for(int i=0;i<n;++i){
        if(a[i].r==p)
            continue;
        if(a[i].l>p){
            ++ans;
            p=a[i].r;
        }else
            ++p;
    }
    printf("%d\n",ans-1);
}

int main()
{
    int T,n;
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        for(int i=0;i<n;++i)
            scanf("%d%d",&a[i].l,&a[i].r);
        sort(a,a+n);
        solve(n);
    }
    return 0;
}

  

时间: 2025-01-13 04:44:19

UVA-1617 Laptop (贪心)的相关文章

UVa 1617 Laptop (贪心)

题意:有n个长度为1的线段,确定它们的起点,使得第i个线段在[ri,di]之间,输出空隙数目的最小值. 析:很明显的贪心题,贪心策略是这样的,先把所有的区间排序,原则是按右端点进行排序,如果相等再按左端点排,然后再扫一遍,如果第一个区间的右端点和第二个右端点一样, 一定可以相邻,如果不相等,再看是不是与左端点大小关系,如果小于左端点,那么就一定会产生空隙,如果不是小于,就可以,那么端点要向右移动一个单位,其他的也样判断. 代码如下: #include <cstdio> #include <

UVA - 1617 Laptop 区间维护

题目大意:有n条长度为1的线段,确定他们的起点,必须是整数,使得第i条线段在[ri,di]之间.最后输出空隙的最小值 解题思路:维护一个最左值和最右值,分别代表不存在间隙的线段所能填充的区间,如果要在下一个区间取线段,如果线段在所维护的区间之内,那么就表示从该维护区间内取线段,可以构成不间断的线段 #include<cstdio> #include<cstring> #include<algorithm> using namespace std; #define max

UVA 1617 Laptop

题意: 有n条长度为1的线段,确定他们的起点,必须是整数,使得第i条线段在[ri,di]之间.最后输出空隙的最小值 分析: 原始数据排序,排序的规则是先按照右端点排序,右端点相同的情况下,再按照左端点排序.然后最左边开始遍历线段,判断第一个右端点是否小于第二个左端点,如果小于,则中间肯定有空隙,标记加1. 代码: #include <iostream>#include <cstdio>#include <cstring>#include <algorithm>

uva 1511 - Soju(贪心)

题目链接:uva 1511 - Soju 题目大意:给出两个点集,问说分别从两个点集中取一点的哈夫曼距离最小值.注意一个点集的x坐标小于0,另一个大于0. 解题思路:因为x2一定大于x1,所以对于x这一维,一定是+x2-x1,所以只需要考虑y这一维坐标即可. #include <cstdio> #include <cstring> #include <cmath> #include <cstdlib> #include <algorithm> u

UVA - 10037 Bridge 贪心

题目大意:有n个人要过桥,每次只能过去两个,且这两个人中至少有一个人要带手电筒,但手电筒只有一个. 每个人都有一个过桥时间,两个人的过桥时间取决于时间长的那个. 问所有人都过桥需要多少时间,怎么过桥 解题思路:贪心,因为所有人都要过桥,且手电筒只有一个,所以要过桥时间短的人把手电筒拿回来. 有两种过桥方式使过桥时间达到最短,假设t1,t2(t1 <= t2)是当前过桥时间最短的两个人,tm,tn是过桥时间最长的两个人,且(tm <= tn) 第一种过桥方式:(不考虑最后一次t1和t2一起过桥)

UVa1617 Laptop (贪心)

链接:http://vjudge.net/problem/UVA-1617 分析:先把每个区间按右端点从小到大排序,再按左端点从小到大排序. 贪心策略: 从左边开始取,首先取第一个区间的右端点,然后在第二个区间里取点时分为3种情况: 1)条件:第二个区间的右端点和第一个区间的右端点相同.策略:此时可以将两个区间的线段调整为相邻的,其实就是将第一个区间中的线段向前挪一个位置给第二个区间中的线段腾出空间. 2)条件:第二个区间的左端点大于第一个区间的右端点.策略:此时中间肯定有空隙,标记加1,然后把

UVa 11039 (排序+贪心) Building designing

白书上的例题比较难,认真理解样例代码有助于提高自己 后面的练习题相对简单,独立思考解决问题,增强信心 题意:n个绝对值各不相同的非0整数,选出尽量多的数排成序列,使得该序列正负交错且绝对值递增. 解法:先按绝对值从小到大排序,然后第一个数先入队,然后依次比较后面的数,如果和队尾的数符号相反则入队,直到所有的数遍历完为止 这里用了异或运算,因为这里面没有0,所谓符号相同的两个数异或值为正,不同符号的数异或值为负 1 //#define LOCAL 2 #include <algorithm> 3

uva 1442:Cave(贪心)

题意:一个洞穴长n,告诉你每个位置的地面高度和顶部高度,让你往里灌水,要求水不能碰到天花板(但可以无限接近).求最多的水量.(洞穴两边视为封闭) 思路:如果知道一个位置向左看最高可以多高,向右看最高可以多高,就可以知道这个位置最终的高度了.方法是扫两次.每次扫的时候,定义一个之前最高值.若之前最高值高于现在的顶,则下降至顶.若低于底,则上升至底(因为后面的这种高度能被这个底挡住).如果在中间则不用变. 代码: #include <cstdio> #include <cstring>

UVA - 1612 Guess 贪心

题目大意:有n个选手参加比赛,题目共有三道,现在给出n个选手每道题的得分和最后的排名,(每道题的得分依据最后检查是否通过来给分,如果没通过得0分,通过得到相应分),问最后一名选手能得到的最高分是多少.(得分相同,ID小的排前面) 解体思路:要最高分,那第一名肯定要三道题都对.维护一个最高分和上一个人的ID号 接着判断一下下一名的得分,如果有得分相同的情况下,就判断一下ID号 如果当前这个人的ID号比较大,就只需要更新ID就可以了 如果没有得分相同的或者得分相同ID号比上一个人小,就找得分最大的且

大白书

UVA 11292 (简单贪心) 题意: n条恶龙,m个勇士,用勇士来杀恶龙.一个勇士只能杀一个恶龙.而且勇士只能杀直径不超过自己能力值的恶龙.每个勇士需要支付能力值一样的金币.问杀掉所有恶龙需要的最少金币. 思路: 贪心,均从小到大排序.为每一条龙找一个恰好能杀他的骑士.简单贪心. UVA 11729 (经典贪心问题) 题意: n个任务,需要交代B分钟,执行J分钟,让你合理选择交代任务的次序,求得n个任务完成的最小总时长. 思路: 经典贪心,通过比较俩俩的关系,得到整个序列的贪心排序方法.这个