这题第一眼就想到暴力。。
枚举每一个ti,就能确定tj,tj一定是剩下数最大或最小的。为了求tj就要求出数列最大最小次大次小。时间复杂度O(n)。
感觉暴力挺有趣的。
1 #include<cstdio> 2 #include<algorithm> 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]) max1=arr[i], maxi=i; 19 if(min1>arr[i]) min1=arr[i], mini=i; 20 } 21 for(int i=1; i<=n; ++i){ 22 if(i!=maxi && max2<arr[i]) max2=arr[i]; 23 if(i!=mini && min2>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 }