贪心 csust1250 绮礼的阴谋

本文通过一个关于第四次圣杯战争中Assassin监视任务的经典区间覆盖问题,介绍了一种使用贪心算法解决的方法。该算法首先对多个区间的起点和终点进行排序,然后通过遍历并比较每个区间的起始位置来计算所有被覆盖区域的总长度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

地址:acmore.net/web/showProblem?id=1250

第四次圣杯战争开始了,为了收集敌人的情报,言峰绮礼命令他的使魔Assassin 将自己的灵体分成n 份,分别监视教堂外的长直走道。
Assassin 每份灵体的能力不同,第i 份灵体可以监视到的区域是[ai, bi],绮礼想知道,监控范围内的区域的总长度是多少。
比如,第一份灵体的视野范围是[-1, 1],第二份灵体的视野范围是[0, 2],第三份灵体的视野范围是[3, 4]。
那么绮礼能获得的全部视野范围是[-1; 2] ∪ [3; 4],长度是4。


Input:
第1 行有一个整数,表示灵体数量n(1 ≤n ≤10000)。接下来有n 行,每行两个整数ai, bi(0≤ai,bi≤2×109),表示第i 个灵体的视野范围是[ai, bi]。
Sample Input:
2
0 1
3 4

Sample Output:
2


感觉这题是区间覆盖里一道非常经典的,特地拿出来与线段树对比

如果这题稍微改下,改成某个点最多能同时被多少个幽灵监控,那就是道很好的线段树了

有时候题目限制条件比较少的时候,贪心是一种很好的方法


#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<vector>
#include<queue>
#include<algorithm>
using namespace std;
typedef long long LL;
const int MX=10000+5;

struct Seg{
    LL L,R;
    bool operator<(const Seg&b)const{
        if(L==b.L){
            return R>b.R;
        }
        return L<b.L;
    }
}A[MX];

int main(){
    int n;
    while(~scanf("%d",&n)){
        for(int i=1;i<=n;i++){
            scanf("%lld%lld",&A[i].L,&A[i].R);
        }
        sort(A+1,A+1+n);

        LL ans=0,L=0,R=0;
        for(int i=1;i<=n;i++){
            if(L<=A[i].L&&A[i].L<=R) R=max(R,A[i].R);
            else{
                ans+=R-L;
                L=A[i].L;R=A[i].R;
            }
        }
        ans+=R-L;
        printf("%lld\n",ans);
    }
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值