zoukankan      html  css  js  c++  java
  • 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;
    }
  • 相关阅读:
    git命令行clone指定分支、更新、冲突解决、提交代码步骤
    row_number() over() 一句话概括,以及max()函数的一种查询分组中最大值的用法
    在实体类中对与记录数量的属性进行修改时,定义相关方法在实体类中,进行修改时方便
    JQuery 获取多个select标签option的text内容
    Mybatis&orcale update语句中接收参数为对象
    zTree异步加载展开第一级节点
    zTree获取当前节点的下一级子节点数
    Mybatis报错 org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.binding.BindingException: Parameter 'parentCode' not found. Available parameters are [0, 1, param1, param2]
    ztree插件异步加载 使用RESTEasy报错 Only resource methods using @FormParam will work as expected. Resource methods consuming the request body by other means will not work as expected.
    Mybatis 报错 There is no getter for property named '***' in 'class java.lang.String'
  • 原文地址:https://www.cnblogs.com/zjbztianya/p/2980022.html
Copyright © 2011-2022 走看看