Codeforces830A【二分+贪心】

本文介绍了一个使用二分查找算法解决的问题实例。该问题涉及判断给定时间内能否满足所有人的钥匙匹配需求,通过分析左右两边的人与钥匙的关系,确定最优方案。文章提供了完整的C++实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

二分其实很好考虑对吧,时间越多,满足的越多,如何judge呢,这个仔细想想还是挺有意思的.
1.左边的人拿左边的钥匙能在这个时间段满足,那就满足,对于整体方案来说是最优的
2.如果左边的对于某把钥匙不满足,之后出现了某个位置钥匙满足,那么之前那把钥匙一定是在这个人的左边,那么进而证明右边的人也一定不会用到这把不满足的钥匙.

//#pragma comment(linker, "/STACK:102400000,102400000")
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <time.h>
using namespace std;
typedef long long LL;
const int Maxn = 2e3 + 7;

int n, k;
LL a[Maxn], b[Maxn], p;

bool Judge(LL Max){
    bool flag;
    int j=0;
    for(int i=0;i<n;i++){
        flag = false;
        while(j<k){
            if((abs(a[i]-b[j]) + abs(b[j]-p)) <= Max){
                flag = true;
                j++;
                break;
            }
            j++;
        }
        if(!flag) return false;
    }
    return true;
}

void solve(){
    LL Left = 0, Right = 1e14;
    while(Left < Right){
        LL mid = Left + (Right - Left) / 2;
        if(Judge(mid)) Right = mid;
        else Left = mid + 1;
    }
    printf("%I64d\n", Left);
}

int main(){
    scanf("%d%d%I64d", &n, &k, &p);
    for(int i=0;i<n;i++) scanf("%I64d", &a[i]);sort(a, a+n);
    for(int i=0;i<k;i++) scanf("%I64d", &b[i]);sort(b, b+k);
    solve();
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值