天天看点

HDU 5461 Largest Point(求ax^2+by的最大值)

题目地址:点击打开链接

题意:求ax^2+by的最大值,x和y在一个数组中

思路:2层暴力超时,那就一层暴力ax^2的所有情况,参考学长A的,思路不是很清晰,等我问清楚了再写详细的

AC代码:

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#include <queue>
#include <stack>
#include <map>
#include <cstring>
#include <climits>
#include <cmath>

using namespace std;

const int maxn = 5e6 + 10;
long long map1[maxn];

int main()
{
    int t,i;
    int n,a,b,cas=1;
    scanf("%d",&t);
    while(t--)
    {
        long long ans = -9223372036854775;
        long long temp;
        scanf("%d%d%d",&n,&a,&b);
        for(i=1; i<=n; i++)
        {
            scanf("%I64d",&map1[i]);
        }
        if(a == 0 && b == 0)
        {
            int l = 0;
            printf("Case #%d: %d\n",cas++,l);
            continue;
        }
        sort(map1+1,map1+n+1);
        for(i=1; i<=n; i++)
        {
            temp = a * map1[i] * map1[i];
            if(i != 1 && i != n)
            {
                temp +=  b * map1[1] > b * map1[n] ? b * map1[1] : b * map1[n];
            }
            else if(i == n)
            {
                temp += b * map1[n-1] > b * map1[1] ? b * map1[n-1] : b * map1[1];
            }
            else if(i == 1)
            {
                temp += b * map1[n] > b * map1[2] ? b * map1[n] : b * map1[2];
            }
            if(temp > ans)
                ans = temp;
        }
        printf("Case #%d: %I64d\n",cas++,ans);
    }
    return 0;
}