杭電acm 5461 Largest Point
阿新 • • 發佈:2019-01-07
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
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; }