【区间贪心】岛屿之间架桥梁(非常难)

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
const int MAX=200001;
struct Island{
    long long left;
    long long right;
};
struct Bridge{
    long long length;//桥的长度
    long long index;//桥的编号
};
struct Interval{
    long long minimun;//区间最小值
    long long maximum;//区间最大值
    long long index;//区间编号
    bool operator<(Interval x)const{
        return maximum > x.maximum;
    }
};
bool IntervalCompare(Interval x,Interval y){
    if(x.minimun==y.minimun)
        return x.maximum<y.maximum;
    else 
        return x.minimun<y.minimun;
}
bool BridgeCompare(Bridge x,Bridge y){
    return x.length<y.length;
}
Island island[MAX];
Bridge bridge[MAX];
Interval interval[MAX];
long long answer[MAX];

bool Solve(int n,int m){
    priority_queue<Interval> myQueue;
    int position =0;//当前区间下标
    int number =0;//搭建桥的数目
    for(int i=0;i<m;i++)
    {
        while(myQueue.top().maximum<bridge[i].length && !myQueue.empty())
            myQueue.pop(); //当前区间无法搭建
        while(position<n-1 && interval[position].minimun<=bridge[i].length
             && interval[position].maximum>=bridge[i].length)
        {
            myQueue.push(interval[position]);
            position++;
        }
        if(!myQueue.empty())
        {
            Interval current = myQueue.top();
            myQueue.pop();
            answer[current.index]=bridge[i].index;
            number++;
        }
    }
    return number==n-1;//判断桥数与区间数是否相等
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值