题解:双指针
2025-09-08 21:15:08
发布于:浙江
8阅读
0回复
0点赞
时间复杂度:O(m log m+n)
先对所有人进行一次排序(高度降序排列)
在对台阶高度和人进行遍历(双指针)
当人不能跨越该层台阶时保存答案
否则台阶++;
#include<bits/stdc++.h>
using namespace std;
struct ikun{
int h,num;
};
bool cmp1(ikun a,ikun b){
return a.h<b.h;
}
int main(){
int n,m,h[5000010],ans[5000010];
int pre[5000010];
ikun b[5000010];
cin>>n>>m;
for(int i=1;i<=n;i++){
cin>>h[i];
pre[i]=h[i]-h[i-1];
}
//for(int i=1;i<=n;i++)
//cout<<h[i];
for(int i=1;i<=m;i++){
cin>>b[i].h;
b[i].num=i;//对人进行编号,方便输出
}
sort(b+1,b+m+1,cmp1);
//for(int i=1;i<=m;i++)
//cout<<b[i].h<<' '<<b[i].num<<endl;
int idx=1;//人数组指针
memset(ans,-1,sizeof ans);//初始化答案数组
for(int i=1;i<=n&&idx<=m;i++){
while(pre[i]>b[idx].h){
ans[b[idx++].num]=h[i-1];//只要不能跨过台阶就保存答案
}
}
for(int i=1;i<=m;i++){
if(ans[i]==-1)
cout<<h[n];//若都能跨越则输出最后一层台阶
else
cout<<ans[i];
cout<<' ';
}
}
这里空空如也
有帮助,赞一个