#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;//判断桥数与区间数是否相等
}
【区间贪心】岛屿之间架桥梁(非常难)
最新推荐文章于 2024-01-24 16:08:59 发布