您的位置:首页 > 其它

hdu5461 Largest Point(沈阳网赛)

2015-09-20 15:13 148 查看

Largest Point

Time Limit: 1500/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)

Total Submission(s): 536 Accepted Submission(s): 230



Problem Description
Given the sequence A


with n


integers t

1

,t

2

,⋯,t

n



.
Given the integral coefficients a


and b

.
The fact that select two elements t

i




and t

j




of A


and i≠j


to maximize the value of at

2

i

+bt

j



,
becomes the largest point.

Input
An positive integer T

,
indicating there are T


test cases.

For each test case, the first line contains three integers corresponding to
n
(2≤n≤5×10

6

),
a
(0≤|a|≤10

6

)


and b
(0≤|b|≤10

6

)

.
The second line contains n


integers t

1

,t

2

,⋯,t

n




where 0≤|t

i

|≤10

6




for 1≤i≤n

.

The sum of n


for all cases would not be larger than 5×10

6



.

Output
The output contains exactly
T


lines.

For each test case, you should output the maximum value of
at

2

i

+bt

j



.

Sample Input
2

3 2 1
1 2 3

5 -1 0
-3 -3 0 3 3


Sample Output
Case #1: 20
Case #2: 0


Source
2015 ACM/ICPC Asia Regional Shenyang Online

题意:求a*t1*t1+b*t2的值最大。
分析:数据不大,可以直接暴力求解,详解见代码。

#include <iostream>
#include <cstdio>
#include <cstring>
#include <stack>
#include <queue>
#include <map>
#include <set>
#include <vector>
#include <cmath>
#include <algorithm>
using namespace std;
const double eps = 1e-6;
const double pi = acos(-1.0);
const int INF = 0x3f3f3f3f;
const int MOD = 1000000007;
#define ll long long
#define CL(a) memset(a,0,sizeof(a))

ll T,n,a,b;
ll t[1000010];
ll min1,min2,max1,max2,k;//分别存最小的数、第二小的数、最大的数、第二大的数和最接近0的数

int main ()
{
    scanf ("%lld",&T);
    for (int cas=1; cas<=T; cas++)
    {
        scanf ("%lld%lld%lld",&n,&a,&b);
        k=INF;
        for (int i=0; i<n; i++)
        {
            scanf ("%lld",&t[i]);
        }
        cout<<"Case #"<<cas<<": ";
        sort(t, t+n);
        for (int i=0; i<n; i++)
        {
            if (t[i]<=0&&t[i+1]>=0)
                k=min(-t[i], t[i+1]);
        }
        min1=t[0]; min2=t[1];
        max1=t[n-1]; max2=t[n-2];//找出这五个数
        if (a<0&&b<0)//然后就是苦逼的找最大解了,注意负数的平方为正数
        {
            printf ("%lld\n",a*k*k+b*min1);
        }
        else if (a<0&&b>0)
        {
            printf ("%lld\n",a*k*k+b*max1);
        }
        else if (a>0&&b<0)
        {
            printf ("%lld\n",max(max(a*max1*max1+b*min1, a*min1*min1+b*min2), a*min2*min2+b*min1));
        }
        else if (a>0&&b>0)
        {
            printf ("%lld\n",max(max(a*max1*max1+b*max2, a*max2*max2+b*max1), a*min1*min1+b*max1));
        }
        else printf ("0\n");
    }
    return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: