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  n integers  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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值