这题第一眼就想到暴力。。
枚举每一个ti,就能确定tj,tj一定是剩下数最大或最小的。为了求tj就要求出数列最大最小次大次小。时间复杂度O(n)。
感觉暴力挺有趣的。
1 #include2 #include 3 using namespace std; 4 __int64 arr[5500000]; 5 int main(){ 6 int t; 7 scanf("%d",&t); 8 for(int cse=1; cse<=t; ++cse){ 9 __int64 n,a,b;10 scanf("%I64d%I64d%I64d",&n,&a,&b);11 for(int i=1; i<=n; ++i){12 scanf("%I64d",arr+i);13 }14 15 __int64 max1=-1000001,max2=-1000001,min1=1000001,min2=1000001;16 int maxi,mini;17 for(int i=1; i<=n; ++i){18 if(max1 arr[i]) min1=arr[i], mini=i;20 }21 for(int i=1; i<=n; ++i){22 if(i!=maxi && max2 arr[i]) min2=arr[i];24 }25 26 __int64 res=a*arr[1]*arr[1]+b*arr[2];27 for(int i=1; i<=n; ++i){28 __int64 tmp=arr[i]*arr[i]*a;29 30 if(max1==arr[i]) res=max(res,tmp+max2*b);31 else res=max(res,tmp+max1*b);32 33 if(min1==arr[i]) res=max(res,tmp+min2*b);34 else res=max(res,tmp+min1*b);35 }36 printf("Case #%d: %I64d\n",cse,res);37 }38 return 0;39 }