给定一个数组序列, 需要求选出一个区间, 使得该区间是所有区间中经过如下计算的值最大的一个:
区间中的最小数 * 区间所有数的和最后程序输出经过计算后的最大值即可,不需要输出具体的区间。如给定序列 [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);
}
}
}