我正准备参加编码比赛。在档案中我发现了这个问题:
给出一系列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]);
}
}
有人能提出更好的解决方法吗?
答案 0 :(得分:1)
tableView.rowHeight = UITableViewAutomaticDimension
tableView.estimatedRowHeight = 60
设法减少了30%的时间