• 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;
    }
  • 相关阅读:
    Ecshop后台管理增加成本价和毛利润统计功能
    如何在Ecshop首页调用积分商城里的商品
    Ecshop调用促销商品
    Python 精选内置函数
    Python爬虫原理
    android中解析后台返回的json字符串
    JSONObject与JSONArray的使用
    python的字符串截取
    centos6系统下网卡bond模式介绍
    fio工具中的iodepth参数与numjobs参数-对测试结果的影响
  • 原文地址:https://www.cnblogs.com/zjbztianya/p/2980022.html
Copyright © 2020-2023  润新知