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

来源:互联网 发布:天涯明月刀 mac 编辑:程序博客网 时间:2024/05/07 23:10

题目地址:点击打开链接

题意:求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;}


0 0