uvalive 4725

来源:互联网 发布:python 交易平台 编辑:程序博客网 时间:2024/05/21 17:51

题意:机场上有两个跑道,分别为W和E,每个时刻,W和E都分别都分别有飞机进入跑道,每个跑道的飞机都按顺序从0开始排序,每个时刻都允许一架飞机起飞,现要求你安排起飞的飞机,使得任意时刻的飞机的最大编号最小。

思路:这个check的时候…..非常非常重要,非常非常容易判断错误….拿std叉了若干时间才发现。要知道当前第一个跑道最多能飞多少,第二个跑道最多能飞多少,两个跑道一共能飞多少,都是一样的思维方式。

#include <bits/stdc++.h>using namespace std;const int maxn = 5000 + 5;int a[maxn], b[maxn];bool judge(int mid, int n){    int can1 = 0, can2 = 0, canTot = 0, sum1 = 0, sum2 = 0;    for(int i = 0; i < n; i++)    {        sum1 += a[i], sum2 += b[i];        int delta1 = max(0, sum1 - mid);        int delta2 = max(0, sum2 - mid);        if(delta1 > can1 || delta2 > can2)        {return false;}        if(delta1 + delta2 > canTot)        {return false;}        if(sum1 - can1 > 0) can1++;        if(sum2 - can2 > 0) can2++;        if(sum1 + sum2 - canTot > 0)    canTot++;    }    return true;}int main(){    int T, n;    scanf("%d", &T);    while(T--)    {        scanf("%d", &n);        for(int i = 0; i < n; i++)  scanf("%d%d", &a[i], &b[i]);        int lb = 0, rb = 1e9;        while(lb < rb)        {            int mid = (lb + rb) / 2;            if(judge(mid, n))   rb = mid;            else lb = mid + 1;        }        printf("%d\n", max(0, rb - 1));    }    return 0;}
原创粉丝点击