Largest PointTime Limit: 1500/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 379 Accepted Submission(s): 170
Problem Description
Given the sequence
A
with
n
integers
t1,t2,⋯,tn
. Given the integral coefficients
a
and
b
. The fact that select two elements
ti
and
tj
of
A
and
i≠j
to maximize the value of
at2i+btj
, 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×106), a (0≤|a|≤106) and b (0≤|b|≤106) . The second line contains n integers t1,t2,⋯,tn where 0≤|ti|≤106 for 1≤i≤n . The sum of n for all cases would not be larger than 5×106 .
Output
The output contains exactly
T
lines.
For each test case, you should output the maximum value of at2i+btj .
Sample Input
Sample Output
|
题意:给你一个n个数组成的序列,又给出两个数a和b,让你从序列中找出两个元素t1和t2使得a * t1 * t1 + b * t2值最大。输出最大值。
分析:t1 和 t2只能取序列的 最大绝对值、最小绝对值、最大值、最小值中的两个。
思路:枚举a和b的不同情况,分别求解最大值。
AC代码:
#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <algorithm>
#define MAXN 5000000+10
#define INF 0x3f3f3f3f
#define LL long long
using namespace std;
LL c[MAXN];
LL a, b;
LL f(LL x, LL y)//a和b的系数
{
return a * x * x + b * y;
}
int main()
{
int t, k = 1;
int n;
scanf("%d", &t);
while(t--)
{
scanf("%d%lld%lld", &n, &a, &b);
LL Minabs = INF;//绝对值最小的数
for(int i = 0; i < n; i++)
scanf("%lld", &c[i]), Minabs = min(Minabs, abs(c[i]));
printf("Case #%d: ", k++);
if(n == 2)
{
printf("%lld\n", max(f(c[0], c[1]), f(c[1], c[0])));
continue;
}
sort(c, c+n);//升序排列
if(a == 0)
{
if(b == 0)
printf("0\n");
else if(b > 0)
printf("%lld\n", f(0, c[n-1]));
else
printf("%lld\n", f(0, c[0]));
}
else if(a > 0)
{
if(b == 0)
printf("%lld\n", f(max(abs(c[0]), abs(c[n-1])), 0));//乘以绝对值最大的数
else if(b > 0)
{
LL x1 = f(max(abs(c[0]), abs(c[n-2])), c[n-1]);//b系数有两个可能
LL x2 = f(max(abs(c[0]), abs(c[n-1])), c[n-2]);
printf("%lld\n", max(x1, x2));
}
else
{
LL x1 = f(max(abs(c[1]), abs(c[n-1])), c[0]);//b系数有两种可能
LL x2 = f(max(abs(c[0]), abs(c[n-1])), c[1]);
printf("%lld\n", max(x1, x2));
}
}
else//a和b均小于0
{
if(b == 0)
printf("%lld\n", f(Minabs, 0));//乘以绝对值最小的数
else if(b > 0)
{
if(c[n-1] == Minabs)//全是非正数
printf("%lld\n", max(f(c[n-1], c[n-2]), f(c[n-2], c[n-1])));
else//存在正数
printf("%lld\n", f(Minabs, c[n-1]));
}
else
{
if(c[0] == Minabs)//全是非负数
printf("%lld\n", max(f(c[1], c[0]), f(c[0], c[1])));
else//存在负数
printf("%lld\n", f(Minabs, c[0]));
}
}
}
return 0;
}