1. 程式人生 > >杭電acm 5461 Largest Point

杭電acm 5461 Largest Point

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

2

3 2 1
1 2 3

5 -1 0
-3 -3 0 3 3



Sample Output

Case #1: 20
Case #2: 0

題意分析:本題是一道網路賽水題,就是卡你對資料結構的靈活運用,剛開始用c++提交超時了,後來用G++交又過了,果然要看人品呀!

程式碼如下:

#include <iostream>
#include <cstdio>
#include <algorithm>

using namespace std;

int t;
long long n,a,b;
long long num[1000000];

bool cmp1(long long a,long long b)
{
    return a*a <= b*b;
}

int main()
{
    scanf("%d",&t);
    int kase = 1;
    while(t--)
    {
        scanf("%lld %lld %lld",&n,&a,&b);
        //int num[1000000];
        for(int i=0;i<n;i++)
        {
            scanf("%lld",&num[i]);
        }
        long long t1 = 0,t2 = 0;
        sort(num,num+n,cmp1);
        if(a>0 && b>0)
        {
            t1 = num[n-1];
            sort(num,num+n);
            t2 = num[n-1];
            if(t1 == t2)
                t2 = num[n-2];
        }
        else if(a>0 && b<0)
        {
            t1 = num[n-1];
            sort(num,num+n);
            t2 = num[0];
             if(t1 == t2)
                t2 = num[1];
        }
        else if(a<0 && b>0)
        {
            t1 = num[0];
            sort(num,num+n);
            t2 = num[n-1];
            if(t1 == t2)
                t2 = num[n-1];
        }
        else if(a<0 && b<0)
        {
            t1 = num[0];
            sort(num,num+n);
            t2 = num[0];
            if(t1 == t2)
                t2 = num[1];
        }
        else if(a==0 && b!=0)
        {
            sort(num,num+n);
            if(b>0)
                t2 = num[n-1];
            else
                t2 = num[0];
        }
        else if(a!=0 && b==0)
        {
            if(a>0)
                t1 = num[n-1];
            else
                t1 = num[0];
        }
        printf("Case #%d: %lld\n",kase++,a*t1*t1+b*t2);
    }
    return 0;
}