hdu 1003 java

这是个什么题呢?我给忘了分类了,哈哈哈哈,好久没动咯。。。。动态规划也行,数字逻辑也行。。。反正就是优化时间,模拟肯定超时。。。

主要想明白两点:

1.从1加到n为负,即sum(1,n)<0,则sum(1,n)+sum(n,s)<sun(n,s);

2.从1加到n为正,即sum(1,n>0),则sum(1,n)+sum(n,s)>sum(n,s);

这就值得什么呢?只要是大于0就一直加,其中和最大的肯定是前几项和的最大值,不可能是从中间开始的。。

小于0了,就不加了,和清0,重新开始。。

注意:

1.都是负数的情况(max初值为-10000,小于-1000)

2.有0的,(多个最大相同值,取第一个,即判定时不要等号)


import java.util.Scanner;

public class Main 
{
	
    public static void main(String args[])
    {
        
		Scanner cin=new Scanner(System.in);
        while(cin.hasNext())
        { 
        		int n= cin.nextInt();
        		int i=0;
        		while(n-->0){
        			i++;
        			int s=cin.nextInt();//总个数
        			int maxStartId=0;//记录最大数的开始id;
        			int maxEndId=0;//记录最大数的结束位;
        			int max=-10000;//记录最大值
        			int sum=0;//记录累加和
        			int sumStartId=0;//记录累加和开始id;
        			int sumEndId=0;//记录累加和结束id;
        			
        			for(sumStartId=sumEndId=1;sumEndId<=s;sumEndId++){
        				sum+=cin.nextInt();
        				if(sum>max){//每次更新max记录。。。。要求第一个,所以不要等号。
        					maxStartId=sumStartId;
        					maxEndId=sumEndId;
        					max=sum;
        				}
        				if(sum<0){//总和小于0,重新开始。。
        					sum=0;
        					sumStartId=sumEndId+1;
        				}
        			}
        			
        			System.out.printf("Case %d:%n%d %d %d%n",i,max,maxStartId,maxEndId);
        			if(n>0) System.out.println();
        		}
   
        }
    }

}

学习使用类结构实现,,,有的不好,刚开始学习java..

import java.util.Scanner;

public class Main 
{
	private static class getsum {
 		private int sum;
 		private int StartId;
 		private int EndId;
 		private getsum (){
 			sum=0;
 			StartId=0;
 			EndId=0;
 		}
	
 	}
    public static void main(String args[])
    {
    	
		Scanner cin=new Scanner(System.in);
        while(cin.hasNext())
        { 
        		int n= cin.nextInt();
        		int i=0;
        		while(n-->0){
        			i++;
        			int s=cin.nextInt();//总个数
        			getsum max=new getsum();
        			max.sum=-10000;
        			getsum sum1=new getsum();
        			
        			for(sum1.StartId=sum1.EndId=1;sum1.EndId<=s;sum1.EndId++){
        				sum1.sum+=cin.nextInt();
        				if(sum1.sum>max.sum){
        					max.sum=sum1.sum;
        					max.StartId=sum1.StartId;
        					max.EndId=sum1.EndId;
        				}
        				if(sum1.sum<0){
        					sum1.sum=0;
        					sum1.StartId=sum1.EndId+1;
        				}
        			}
        			System.out.printf("Case %d:%n%d %d %d%n",i,max.sum,max.StartId,max.EndId);
        			/*int maxStartId=0;//记录最大数的开始id;
        			int maxEndId=0;//记录最大数的结束位;
        			int max=-10000;//记录最大值
        			int sum=0;//记录累加和
        			int sumStartId=0;//记录累加和开始id;
        			int sumEndId=0;//记录累加和结束id;
        			
        			for(sumStartId=sumEndId=1;sumEndId<=s;sumEndId++){
        				sum+=cin.nextInt();
        				if(sum>max){//每次更新max记录。。。。要求第一个,所以不要等号。
        					maxStartId=sumStartId;
        					maxEndId=sumEndId;
        					max=sum;
        				}
        				if(sum<0){//总和小于0,重新开始。。
        					sum=0;
        					sumStartId=sumEndId+1;
        				}
        			}
        			
        			System.out.printf("Case %d:%n%d %d %d%n",i,max,maxStartId,maxEndId);*/
        			
        			if(n>0) System.out.println();
        		}
   
        }
        cin.close();
    }

}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值