#include <iostream> #include <cstdio> #include <algorithm> #include <cstring> #include <map> #include <set> #include <vector> #include <cmath> #define inf 0x3f3f3f3f3f3f3f3f using namespace std; int T,t[5001000]; int main() { int cas=0,t1,t2; scanf("%d",&T); while(T--) { long long ans11=-inf,ans12=-inf,ans21=-inf,ans22=-inf; cas+=1; int n,a,b; long long ans=0; scanf("%d%d%d",&n,&a,&b); for(int i=1; i<=n; i++) { scanf("%d",&t[i]); } for(int i=1; i<=n; i++) { if(1LL*a*t[i]*t[i]>ans11) { ans11=1LL*a*t[i]*t[i]; t1=i; } } for(int i=1; i<=n; i++) { if(1LL*a*t[i]*t[i]>=ans12&&1LL*a*t[i]*t[i]<=ans11&&i!=t1) ans12=1LL*a*t[i]*t[i]; } for(int j=1; j<=n; j++) { if(1LL*b*t[j]>ans21) { ans21=1LL*b*t[j]; t2=j; } } for(int j=1; j<=n; j++) { if(1LL*b*t[j]>=ans22&&1LL*b*t[j]<=ans21&&j!=t2) ans22=1LL*b*t[j]; } if(a!=0&&b!=0) { if(t1==t2) { ans=max(ans11+ans22,ans12+ans21); } else ans=ans11+ans21; } else ans=ans11+ans21; cout<<"Case #"<<cas<<": "<<ans<<endl; } return 0; }
水题....但是脑袋短路写的时间不短..思路是找到最大和第二大的a*t[i]*t[i]和b*t[j],然后判断即可
时间: 2024-10-13 17:49:38