Codeforces830A【二分+贪心】

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

//#pragma comment(linker, "/STACK:102400000,102400000")
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
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;ifalse;
        while(jif((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;iscanf("%I64d", &a[i]);sort(a, a+n);
    for(int i=0;iscanf("%I64d", &b[i]);sort(b, b+k);
    solve();
    return 0;
}

你可能感兴趣的:(二分,贪心)