双指针新手解法(认真)
2026-06-27 13:42:07
发布于:北京
8阅读
0回复
0点赞
我这道题很弱智,欢迎简化!!!
用一个结构体包括编号,腿长,以及最后能爬到的最大高度。
struct node {
int id ;
int t;
int ans ;
}r[N];
然后建立a数组和b数组,表示台阶高度和下一级台阶与当前这级台阶的高度差。
先输入
int n , m ;
cin >> n >> m ;
for(int i = 1 ; i <= n ; i++) cin >> a[i];
for(int i = 1 ; i <= m ; i++) {
cin >> r[i].t;
r[i].id = i;
}
在给结构体排序,腿长单调递增,方便双指针
bool cmp(node x , node y) {
return x.t < y.t ;
}
sort(r + 1 , r + 1 + m , cmp);
然后记录b数组,注意,第一个台阶也有高度,所以又要记录第一个台阶与地面的距离
for(int i = 0 ; i < n ; i++) {
b[i] = a[i + 1] - a[i];
}
然后双指针
int l1 = 0 ;
int l2 = 1 ;
while(l1 < n && l2 <= m) {
if(b[l1] <= r[l2].t) l1++;
else {
r[l2].ans = a[l1];
l2++;
}
}
最后因为可能因为l1已经到头,但l2仍为到头,所以剩下的一定在最顶端,直接等与a[n]
for(int i = l2 ; i <= m ; i++) {
r[i].ans = a[n];
}
最后按编号输出
bool cmp2(node x , node y){
return x.id < y.id;
}
sort(r + 1 , r + 1 + m , cmp2);
for(int i = 1 ; i <= m ; i++) {
cout << r[i].ans << " ";
}
完整版!知道你不爱看前面的
#include <bits/stdc++.h>
using namespace std ;
const int N = 1e6 ;
int a[N] , b[N] ;
struct node {
int id ;
int t;
int ans ;
}r[N];
bool cmp(node x , node y) {
return x.t < y.t ;
}
bool cmp2(node x , node y){
return x.id < y.id;
}
signed main () {
int n , m ;
cin >> n >> m ;
for(int i = 1 ; i <= n ; i++) cin >> a[i];
for(int i = 1 ; i <= m ; i++) {
cin >> r[i].t;
r[i].id = i;
}
sort(r + 1 , r + 1 + m , cmp);
for(int i = 0 ; i < n ; i++) {
b[i] = a[i + 1] - a[i];
}
int l1 = 0 ;
int l2 = 1 ;
while(l1 < n && l2 <= m) {
if(b[l1] <= r[l2].t) l1++;
else {
r[l2].ans = a[l1];
l2++;
}
}
for(int i = l2 ; i <= m ; i++) {
r[i].ans = a[n];
}
sort(r + 1 , r + 1 + m , cmp2);
for(int i = 1 ; i <= m ; i++) {
cout << r[i].ans << " ";
}
return 0 ;
}
这里空空如也




有帮助,赞一个