杭电acm 5461 Largest Point

来源:互联网 发布:女朋友给前任口过知乎 编辑:程序博客网 时间:2024/06/03 20:40
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;}


0 0
原创粉丝点击