题目链接:http://8be0ed4d.ngrok.io/contest/1/problem/C
这道题需要稍微化简一下,变成这个形式:
然后轻易得出:当P/K最小时候,结果最小。
然后可以枚举i,j用一个数组存储j之后可能p和k组合的最大p/k;
import java.io.*;
import java.util.*;
public class Main {
static StreamTokenizer in = new StreamTokenizer(new BufferedReader(new InputStreamReader(System.in)));
public static void main(String args[]) throws IOException{
int t =getInt();
while(t--!=0){
int n=getInt();
double arr[]=new double[n]; //用来存储每一位的位数
double aa[]=new double[n]; //用来储存每一位后面p和k组合而成的最大的 p/k的值
double min[]=new double[n]; //用来储存这一位到最后一位最小值,方便计算数组aa
for(int i=0;i<n;i++)arr[i]=getDouble();
min[n-1]=arr[n-1];
aa[n-1]=0;
for(int i=n-2;i>=0;i--){
min[i]=Math.min(min[i+1],arr[i]); //min的每一位是取上一位的最小值和这一位最小的。
aa[i]=Math.max(arr[i]/min[i+1],aa[i+1]); //aa的这一位最小值是这一位的数除以上一位最小值
}
double ans=0;
for(int i=0;i<n-2;i++){ //两层循环找答案
for(int j=i+1;j<n-2;j++){
ans=Math.max((arr[j]*aa[j+1]+arr[j])/(arr[i]+arr[j]), ans);
}
}
System.out.printf("%.3f",ans-1);
System.out.println();
}
}
static int getInt() throws IOException{
in.nextToken();
return (int) in.nval;
}
static double getDouble() throws IOException{
in.nextToken();
return in.nval;
}
}