关于百度之星1003题目存在的问题

Zelmira 2019-08-13 10:51:24
个人认为答案是正确的,但是提交的时候出错了,找不出原因(思想或者输出有问题),求指教


问题:



代码:


/*
* 题目:计算子序列的最大和
* 思路:在整个个序列中,如果它的某个子序列的和小于0,则将它加上其他的子序列则其结果不可能成为最大和
* 所以将整个序列从a[0]开始,到a[length-1]结束,
* 假设它从a[0]到a[p]的值大于或等于0(a[0]+a[1]+...+a[p]>=0;a[0]+a[1]+...+a[p-1]<=0)
* 从a[p+1]到a[q]的值大于或等于0(a[p+1]+a[p+2]+...+a[q]>=0;a[p+1]+a[p+2]+...+a[q-1]<=0)
* 从a[z+1]到a[length-1]的值大于或等于0(a[z+1]+a[z+2]+...+a[length-1]>=0;a[z+1]+a[z+2]+...+a[length-2]<=0)
* 那么此时,序列将分为三部分,然后将连续并且>0的序列加起来即可。各个子序列的长度不一定相同,但是除了最后一个子序列,他们的和都一定大于0,
* 我们只要判断最后一个子序列是否>0即可,如果最后一个子序列>0,则加上,如果<0,则不加。并且所得的结果要减去a[0]-a[p-1]的和。
* (!!这只是假设其中的一种情况,只是为了解释说明思想)
* 需要注意的是,这种思想只适用于a[0]>=0的情况。如果前面的几个是负数,那应该先排除前面的,从>0的数开始。
* 如果没有大于0的数(即全为负数),则子序列的最大和为第一个负数
*
* 算法分析:用star和end分别代表子序列的开始下标及结束下标。用for循环来控制求和的结果sum1,第一次,当sum1>0时,sum=a[end]
* star=end+1,继续求第二个子序列的和sum2,sum=sum+sum2;...sum=sum+sum3...当end>=length-1时结束
* 未知变量:arr
*/

import java.util.Scanner;
public class Main1003{

public static void main(String args[]) {
Scanner sc=new Scanner(System.in);
int T=sc.nextInt();//控制输入的行数
for (int count=1; count<=T; count++) {//控制输入的行
int N=sc.nextInt();//数组s的长度
int a[] = new int[N];//创建一个数组
for(int j=0; j<a.length; j++) {//将输入的数存入数组中
a[j]=sc.nextInt();
}
//输出结果
System.out.println("Case "+count+":");
sumArr(a);
if(count!=T)
System.out.println();
}
}


//数组求和,某个区间内的和(下标表示)
public static void sumArr(int arr[]) {
int max=arr.length-1;//数组的最大下标值为length-1;
int star=0;//初始化子序列的开始下标,初始值为0;
int end=0;////初始化数组的结束下标,初始值为0;
int sum=0;//初始化和为0,计算子序列的最大和
int sum2=0;//计算子序列的和
int sumAll=0;//判断整个序列是否都为负数
boolean boo=false;//用来判断前面的数是否为正;默认为负数,false,当遇到正数时,为true
int flag=0;//用来计算是有几个和大于0的子序列

for(int i=0; i<arr.length;i++) {
if(arr[i]>=0) {//当arr[i]>=0时,改变boo的值
boo=true;
}
if(boo==true) {
sum2+=arr[i];
if (sum2>=0) {
flag++;
if (flag==1) {//第一个子序列
star=i; //所求序列的开始坐标
//sum2=arr[i];//第一个>0的序列的最后一个数
}
end=i;
sum+=sum2;
sum2=0;
}
}
}
if(boo==false) {
sum=arr[0];
}
star=star+1;
end=end+1;
System.out.println(sum+" "+star+" "+end);
}
}





运行结果:

...全文
69 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
qybao 2019-08-14
  • 打赏
  • 举报
回复
原因不是很明了吗?一看负数序列就不满足
比如{-3, -2, -1},就这个程序,最大和肯定是选出-3(应为boo==false),但实际结果应该是-1

50,530

社区成员

发帖
与我相关
我的任务
社区描述
Java相关技术讨论
javaspring bootspring cloud 技术论坛(原bbs)
社区管理员
  • Java相关社区
  • 小虚竹
  • 谙忆
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧