题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=5461
解题思路:
根据二次函数和一次函数的图形可知,先求出二次函数的最大值,再求出一次函数的最大值即可。。。
AC代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define INF 0xfffffff
using namespace std;
typedef long long ll;
ll num[5000005];
int vis[5000005];
bool cmp(ll x,ll y){
return x*x < y*y;
}
int main(){
int T,t = 1;
scanf("%d",&T);
while(T--){
int n,a,b;
memset(vis,0,sizeof(vis));
scanf("%d%d%d",&n,&a,&b);
for(int i = 0; i < n; i++)
scanf("%lld",&num[i]);
sort(num,num+n,cmp);
ll sum1,sum2 = 0;
if(a > 0){
sum1 = a*num[n-1]*num[n-1];
vis[n-1] = 1;
}
else{
sum1 = a*num[0]*num[0];
vis[0] = 1;
}
for(int i = 0; i < n; i++){
if(!vis[i] && sum2 < b*num[i])
sum2 = b*num[i];
}
printf("Case #%d: %lld\n",t++,sum1+sum2);
}
return 0;
}