HDU5461 Largest Point(暴力)

这题第一眼就想到暴力。。

枚举每一个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 }

 

posted @ 2015-10-02 10:53  WABoss  阅读(197)  评论(0编辑  收藏  举报