二分后贪心
#include<bits/stdc++.h>
using namespace std;
#define LL long long
const int maxn = 112345;
const LL INFF = 0x3f3f3f3f3f3f3f3fll;
LL h[maxn],p[maxn];
int n,m;
bool check(LL x){
int pos = 0;
for(int i=0;i<n;i++){
LL far = h[i];
if(p[pos] >= h[i]) far += x;
else{
if(p[pos] < h[i] - x) continue;
far = max(far,h[i] + (x - (h[i] - p[pos])) / 2);
far = max(far,h[i] + (x - 2 * (h[i] - p[pos])));
}
while(pos < m && p[pos] <= far)
pos++;
if(pos == m) return true;
}
return pos == m;
}
LL solve(){
LL st = 0,ed = INFF;
LL ans = -1;
while(st <= ed){
LL mid = (st + ed)>>1;
if(check(mid)){
ans = mid;
ed = mid - 1;
}
else{
st = mid + 1;
}
}
return ans;
}
int main(){
scanf("%d %d",&n,&m);
for(int i=0;i<n;i++){
scanf("%I64d",&h[i]);
}
for(int i=0;i<m;i++){
scanf("%I64d",&p[i]);
}
printf("%I64d\n",solve());
return 0;
}
本文介绍了一种结合二分查找与贪心策略解决特定问题的算法实现。通过定义问题的状态与目标,利用二分查找缩小搜索范围,并采用贪心策略进行局部最优选择,最终求得全局最优解。代码中详细展示了输入输出处理、状态转移逻辑及边界条件判断。
546

被折叠的 条评论
为什么被折叠?



