查找范围

时间:2016-10-22 04:33:28

标签: java arrays optimization

我正准备参加编码比赛。在档案中我发现了这个问题:

给出一系列N个正整数i1,i2,...,iN。此外,您将分别获得起始整数b和下限和上限整数限制min和max。注意0≤min≤b≤max始终。

序列游戏如下进行。最初,你的分数是b。在步骤1中,您可以将i1添加到b或从b中减去i1以获得新的scoreb1。在步骤2中,通过添加或减去i2来更新b1以获得新分数b2。以这种方式进行,在步骤j中,通过添加或减去ij来更新bj-1以获得新的分数bj。规则是每个得分bj应始终位于min和max之间,包括:即,对于每个j,1≤j≤N,应该是min≤bj≤max的情况。在使用序列中的最后一个数字后,您的最终得分为bN。

您的目标是在按照规则进行比赛时最大化您的最终得分。如果没有超出界限最小值和最大值就无法完成所有N个步骤,则得分为-1。

例如,假设您拥有的数字序列为[2,3,4],b为5,min为0且max为8.在步骤1之后,得分可以是3或7.在步骤2之后,得分可以是0,4或6.由于max为8,因此不允许10分。在第3步之后,得分可以是0,2,4或8.因此,在这个游戏中,你的最高分数是可以在序列的最后得到8。

输入格式

输入的第一行包含四个整数N,b,min和max,其含义如上所述。第二行输入包含N个空格分隔的整数,即播放游戏的顺序。

输出格式

您的输出应该是由一个整数组成的单行,这是您可以达到的最高分数。

TESTDATA

在所有情况下,N≤103且0≤min≤b≤max≤103。

示例输入

3 5 0 8 2 3 4 

示例输出

8 

现在,我尝试使用递归技术来解决这个问题,但速度太慢了。我检查了所有可能的安排。也许这就是我出错的地方。这是我的代码:

import java.io.*;

class seq2

{

    public static void recursive(int ar[],int turn,int sum,int max,int min,int n,int mega[])

    {

        if(turn!=n)

        {

            if(ar[turn]+sum<=max)

            {

                sum=sum+ar[turn];

                recursive(ar,turn+1,sum,max,min,n,mega);

                sum=sum-ar[turn];

            }

            if(sum-ar[turn]>=0)

            {

                sum=sum-ar[turn];

                recursive(ar,turn+1,sum,max,min,n,mega);

                sum=ar[turn]+sum;

            }

            if((ar[turn]+sum>max)&&(sum-ar[turn]<min))

            {

                sum=-1;

            }

        }

        else

        {

            if(sum>mega[0])

            {

                mega[0]=sum;

            }

        }

    }

    public static void main(String args[])throws IOException

    {

        DataInputStream in=new DataInputStream(System.in);

        int n=Integer.parseInt(in.readLine());

        int b=Integer.parseInt(in.readLine());

        int min=Integer.parseInt(in.readLine());

        int max=Integer.parseInt(in.readLine());

        System.out.println();

        int ar[]=new int[n],a;

        for(int i=0;i<n;i++)

        {

             a=Integer.parseInt(in.readLine());

             ar[i]=a;

        }

        int mega[]={-1};

        recursive(ar,0,b,max,min,n,mega);

        System.out.println(mega[0]);

    }

}

有人能提出更好的解决方法吗?

1 个答案:

答案 0 :(得分:1)

tableView.rowHeight = UITableViewAutomaticDimension
tableView.estimatedRowHeight = 60

设法减少了30%的时间