• UVa1450 Airport


    A big city has an international airport handling 40 million passengers a year. But this is notorious as one of the most congested airports in the world. In this airport, there is only one landing strip as in the above figure. Therefore the landing strip is always crowded with a lot of aircrafts waiting for a takeoff. There are two ways, say west-road W and east-road E, to approach the landing strip. The aircrafts are waiting for a takeoff on the two roads as in the above figure.

     

    \epsfbox{p4725.eps}

    At each time t, an arbitrary number of aircrafts arrive on the roads W and E. Each aircraft arriving on W or E at time t receives a rank, which is equal to the number of the waiting aircrafts on the same road to precede it. Then the one of W and E is chosen by a control tower, and the most front aircraft on the road leaves the ground. Given an information of the arriving aircrafts at times, we are concerned in the takeoff schedule of the control tower to minimize the maximum rank of the aircrafts.

     

        roads    
          W E
    times        
      1   A1A2A3 B1B2
      2     B3B4B5
      3   A4A5  

    For example, the above table represents the aircrafts arriving on the roads W and E at each time. At time 1, the aircrafts A1A2 and A3 receive the ranks 0, 1 and 2, respectively, and the aircrafts B1 and B2 receive the ranks 0 and 1, respectively. Then the control tower allows the aircraft B1 on the road E to take off, and B1leaves the ground. At time 2, the aircrafts B3B4, and B5 receive the ranks 1, 2 and 3, respectively. Then A1 on the road W is allowed to take off, and it leaves the ground. At time 3, the aircrafts A4 and A5 receive the ranks 2 and 3, respectively. So the maximum rank of the aircrafts is 3, and this is the minimum of the maximum rank over all the possible takeoff schedules.

     

    Input 

    Your program is to read from standard input. The input consists of T test cases. The number of test cases T is given on the first line of the input. The first line of each test case contains an integer n (1$ \le$n$ \le$5000) , the number of times. In the next n lines of each test case, the i-th line contains two integer numbers ai and bi, representing the number of arriving aircrafts on the road W and E, respectively, at time i, where 0$ \le$aibi$ \le$20.

     

    Output 

    Your program is to write to standard output. Print exactly one line for each test case. The line contains the minimum of the maximum rank over all the possible takeoff schedules.

    The following shows sample input and ouput for three test cases.

     

    Sample Input 

     

    3 
    1 
    1 1
    3 
    3 2
    0 3
    2 0
    6 
    0 1
    1 1
    1 2
    1 1
    1 1
    6 0
    

     

    Sample Output 

    5

    题解:自己YY了一个解法,样例都通过了,不过WA了,后来想想确实是有BUG的,不过不知道怎么弄,参考了这位网友的思路(代码也完全抄他的啊。。。我果断是个大弱逼),不过二分的过程是我用以前的方法写的,具体如下:

    while(l<r)
    {
        m=l+(r-l+1)/2;
       if(check(m)) r=m;
       else
       l=m+1;
    }

    然后果断死循环了。。。然后把m的值修改为m=l+(r-l)/2,提交上去果断WA。。。无奈只好改成前面这个网友的主过程,然后AC了。。。为毛二分还有这么大区别!!!擦擦擦

    各种无语啊,看来还需要好好考虑才行啊。。。。

    搓比献上模仿代码:

    #include<stdio.h>
    #include<stdlib.h>
    #define MAXN 5005
    int a[MAXN],b[MAXN];
    int n;
    int check(long s)
    {
        long ans=0,suma=0,sumb=0,cana=0,canb=0,i;
        for(i=0; i<n; i++)
        {
            suma+=a[i];
            sumb+=b[i];
            while(suma>s)
            {
                if(ans==0||cana==0) return 0;
                suma--;
                ans--;
                cana--;
    
            }
            while(sumb>s)
            {
                if(ans==0||canb==0) return 0;
                sumb--;
                ans--;
                canb--;
    
            }
            if(cana+1<=suma)
                cana++;
            if(canb+1<=sumb)
                canb++;
            if(ans+1<=(suma+sumb))
                ans++;
        }
    
        return 1;
    }
    int main(void)
    {
        long T,i,l,r,m,t;
        scanf("%ld",&T);
        while(T--)
        {
            t=0;
            scanf("%d",&n);
            for(i=0; i<n; i++)
            {
                scanf("%d%d",&a[i],&b[i]);
                t+=a[i]+b[i];
            }
            l=0; r=t;
            while(l+1<r)
            {
                m=(l+r)/2;
                if(check(m))r=m;
                else
                    l=m;
            }
            printf("%ld\n",l);
        }
        return 0;
    }
  • 相关阅读:
    web性能优化
    9.1_the end
    8.28_the end
    1.获取元素绝对位置
    8.14_end
    JavaScript 函数用途
    JavaScirpt事件处理
    《JavaScript语言精粹》读书笔记
    《图解http协议》之HTTPs学习笔记
    Laya 1.x 按文件夹TS代码合并
  • 原文地址:https://www.cnblogs.com/zjbztianya/p/2980022.html
Copyright © 2020-2023  润新知