hdu 5461 Largest Point(暴搞)

Largest Point

Time Limit: 1500/1000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)
Total Submission(s): 1450    Accepted Submission(s): 579


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  ij 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 (2n5×106), a (0|a|106) and  b (0|b|106). The second line contains  nintegers  t1,t2,,tn where  0|ti|106 for  1in.

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
 
  
2 3 2 1 1 2 3 5 -1 0 -3 -3 0 3 3
 

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

solution:

求a*ti^2+b*tj 且i!=j 直接暴力即可 记录前者和后者最大和次大 用map统计一下最大出现的次数 然后瞎搞即可

#include<cstdio>
#include<algorithm>
#include<map>
using namespace std;
typedef long long ll;
int n;
ll a, b,x,y,z;
int main()
{
    int t,cnt=1;
    scanf("%d", &t);
    while (t--)
    {
        scanf("%d%I64d%I64d", &n, &a, &b);
        ll max1 = -1e18, max2 = -1e18 - 1, max3 = -1e18, max4 = -1e18 - 1;
        int pos1, pos3;
        map<long long, int>q;
        for (int i = 0; i < n; i++)
        {
            scanf("%I64d", &x);
            y = a*x*x; z = b*x;
            if (y > max1)
            {
                max2 = max1;
                max1 = y; pos1 = i;
                q[max1]++;
            }
            else if (y > max2)
            {
                max2 = y;
            }
            if (z > max3)
            {
                max4 = max3;
                max3 = z; pos3 = i;
                q[max3]++;
            }
            else if (z > max4)
            {
                max4 = z;
            }
        }
        printf("Case #%d: ", cnt++);
        if (pos1 != pos3 || q[max1] > 1||q[max3]>1)printf("%I64d\n", max1 + max3);
        else printf("%I64d\n", max(max1 + max4, max2 + max3));
    }
    return 0;
}


猜你喜欢

转载自blog.csdn.net/qq_22522375/article/details/51524919