题解:优先队列
2025-09-10 14:45:19
发布于:北京
3阅读
0回复
0点赞
我们把台阶的差值求出来,这样能不能爬到这个台阶,只需要确认前面所有台阶差值的最大值就可以了,拿c数组来存值。然后我们用优先队列来存腿长和他的下标位置。开始从大往小进行选择,当我队列里的值大于最大的差值,我就可以跨到这个台阶,如果不大于,说明队列里的其他元素也不可能大于,因为优先队列默认腿长从大到小排序,所有我们放弃这个台阶,也就是n--,然后开始继续判断。如果判断完了队列里还有值,说明队列剩下的元素都是一个台阶也爬不动的,输出0就可以了。
#include <bits/stdc++.h>
using namespace std;
#define V vector
#define all0(x) (x).begin(),(x).end()
#define all1(x) (x).begin()+1,(x).end()
#define pb push_back
#define eb emplace_back
#define fi first
#define se second
#define lb lower_bound
#define ub upper_bound
#define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
typedef long long LL;
typedef pair<int, int> pi;
typedef pair<LL, LL> pl;
const int N = 5e5 + 20;
const int INF = 0x3f3f3f3f;
const LL INFLL =0x3f3f3f3f3f3f3f3f;
int a[N],b[N],c[N];
void so() {
int n , m;
cin >> n >> m;
int p = m , k = n;
priority_queue<pi> q;
int x = 0;
for(int i = 1 ; i <= n ; i++ ) {
cin >> a[i];
x = max(a[i] - a[i - 1] , x);
c[i] = x;
}
// for(int i = 1 ; i <= n ; i++ ) cout << c[i] << " ";
for(int i = 1 ; i <= m ; i++ ) {
cin >> b[i];
q.push({b[i] , i});
}
while(!q.empty() &&(n >= 1)){
auto s = q.top();
if(s.fi >= c[n]){
b[s.se] = a[n];
q.pop();
}
else{
n--;
}
}
while(!q.empty()){
auto s = q.top();
q.pop();
b[s.se] = 0;
}
for(int i = 1 ; i <= p ; i++ ) cout << b[i] <<' ' ;
}
int main() {
IOS
int tt=1;
// cin >> tt;
while (tt--)
so();
}
这里空空如也
有帮助,赞一个