编写程序过程

给定一个数组序列, 需要求选出一个区间, 使得该区间是所有区间中经过如下计算的值最大的一个:

区间中的最小数 * 区间所有数的和最后程序输出经过计算后的最大值即可,不需要输出具体的区间。如给定序列  [6 2 1]则根据上述公式, 可得到所有可以选定各个区间的计算值:

[6] = 6 * 6 = 36;

[2] = 2 * 2 = 4;

[1] = 1 * 1 = 1;

[6,2] = 2 * 8 = 16;

[2,1] = 1 * 3 = 3;

[6, 2, 1] = 1 * 9 = 9;

从上述计算可见选定区间 [6] ,计算值为 36, 则程序输出为 36。

区间内的所有数字都在[0, 100]的范围内;

输入描述:

第一行输入数组序列长度n,第二行输入数组序列。
对于 50%的数据,  1 <= n <= 10000;
对于 100%的数据, 1 <= n <= 500000;


 

输出描述:

输出数组经过计算后的最大值。

输入例子1:

3
6 2 1

输出例子1:

36

暴力破解,通过率是30%

import java.util.Scanner;
public class Main {
    static int min(int [] s, int i, int j){
        if(i==j) return s[i];
        int k;
        int min=s[i];
        for(k=i;k<=j;k++)
        {
            if(s[k]<min)
                min=s[k];
        }
     return  min;
        }
    static int sum(int [] s, int i, int j){
        int sum=0;
        for (int l = i; l <=j; l++) {
            sum=sum+s[l];
        }
        return sum;
        }
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
         while (in.hasNextInt()) {//注意while处理多个case
            int a = in.nextInt();
            int []s=new int[a];
            int i,j,mul;
            int max=0;
             for ( i = 0; i <a ; i++) {
                 s[i]=in.nextInt();
             }
             for( j=0;j<a;j++)
                 for(i=0;i<a-j;i++)
                 { mul=min(s,i,i+j)*sum(s,i,i+j);
                  if(mul>max) max=mul;
                 }
             System.out.println(max);
        }
    }
}

下面方法是完全ac的

import java.util.Scanner;

public class Main {

    public static void main(String[] args) {

        Scanner in = new Scanner(System.in);
        while (in.hasNextInt()) {//注意while处理多个case
            int a = in.nextInt();
            int []s=new int[a];
            int i,j,mul;
            for ( i = 0; i <a ; i++) {
                s[i]=in.nextInt();            }
            int sum,min;
            int MUL=1;
            for( j=0;j<a;j++) {//依次从某个开始,往右移找到最大的。
                sum = s[j];
                min = s[j];
                mul = sum * min;
                for (i = j+1; i < a; i++) {
                    if(s[i]<=0) break;
                    sum=sum+s[i];
                    if(s[i]<min) min=s[i];

                    if (sum*min > mul) mul = sum*min ;
                }
                if(mul>MUL) MUL=mul;
            }
            System.out.println(MUL);
        }


    }
}
 

猜你喜欢

转载自blog.csdn.net/fyyf168lee/article/details/82252488