ACM(百度之星题目)-1003-JAVA

题目:
在这里插入图片描述


/*
 *思路:在整个个序列中,如果它的某个子序列的和zsum小于0,则将zsum加上其他的子序列则其结果不可能成为最大和
 *将序列从第一个开始,若它到某(n)个值的和小于0,则它是第一个子序列,然后从(n+1)开始,...一直将序列分为m个不同长度的子序列
 *先求出第一个子序列的最大和max1,然后计算第二个子序列的最大和max2...计算第m个子序列的最大和maxm,max1到maxn的最大值则为所求max
 *起始位置则为该子序列的起始位置,结束位置则为该子序列的结束位置
 *
 *算法分析:
 *(1)将子从第一个数开始求和zSum,若zSum>max(子序列的最大和,初始化为第一个值),则将zSum的值赋值给max,
 *此时该子序列的下标的起始(start)和结束位置(end)为所求的起始和结束位置。(start,j)
 *(2)当zSum<0时,则重新开始下一个子序列的计算,zSum=0,此时要标记开始位置temp(temp=j+1,前一个子序列的结束下标+1),当满足(1)时,将temp赋值给start
 *未知变量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 i = 1; i <= T; i++)	//控制行
        {
        	int n=sc.nextInt();	//控制一行输入多少个数
        	int a[]=new int [n];
        	for(int j=0; j<a.length; j++) {
        		a[j]=sc.nextInt();
        	}
        	//输出结果
            System.out.println("Case "+i+":");
//            System.out.println(max+" "+start+" "+end);
            maxZArr(a);
            if(i!=T)
                System.out.println();
        }
	}
	public static void maxZArr(int arr[]) {
		int zSum=0;	//初始化子序列的和为0
		int max=arr[0];	//初始化子序列最大和为max
		int start=0;	//初始化子序列开始的下标为0
		int end=0;	//初始化子序列结束的下标为0
		int temp=0;	//初始化子序列标记的下标为0(用来标记另一个子序列开始的坐标值)
		for(int i=0; i<arr.length; i++) {
			zSum+=arr[i];	//子序列求和,从第一个开始
			if (zSum>max) {	//如果子序列的和大于最大值,则将子序列的和赋给最大值,并且确定开始和结束的位置
				max=zSum;
				start=temp;
				end=i;
			}
			if(zSum<0) {
				zSum=0;	//当子序列的和<0时,将子序列和置0,开始计算下一个子序列的和
				temp=i+1;	//标记后一个子序列的开始下标
			}
		}
		System.out.println(max+" "+(start+1)+" "+(end+1));
		
	}
}

思路来源:百度代码(可用)

import java.util.Scanner;
 
public class Main1003
{
    public static void main(String[] args)
    {
        Scanner s=new Scanner(System.in);
        int cas=s.nextInt();
        for (int i = 1; i <= cas; i++)	//控制行
        {
            int n=s.nextInt();	//控制一行输入多少个数
            int sum = 0, max = -0xfffffff;	//设置默认初始化,sum为序列的和,max为子序列的最大和
            int start=1, last=1, temp = 1;	//star为子序列的起始位置,last为子序列的结束位置
            for (int  j= 1; j<= n; j++)	//相当于遍历输入的一行数
            {
                int a = s.nextInt();	//输入数据
                sum += a;	//
                System.out.println("j:"+j);
                if (sum > max)
                {
                    max = sum;
                    start = temp; 
                    last = j;
                    System.out.println("for:"+max+" "+start+" "+last+" temp:"+temp+" sum:"+sum);
                }
                if (sum < 0)
                {
                    temp = j+ 1;
                    sum = 0;
                    System.out.println("for2:"+max+" "+start+" "+last+" temp:"+temp+" sum"+sum);
                }
                
            }
            //输出结果
            System.out.println("Case "+i+":");
            System.out.println(max+" "+start+" "+last);
            if(i!=cas)
                System.out.println();
        }
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值