作者:手机用户2602897795 | 来源:互联网 | 2023-09-18 14:06
2018TYUT暑期ACM模拟赛(10) Largest Point HDU - 5461 思路:一个结构体直接保存t*t*a和t*b,利用两个比较函数将两个值分别进行从小到大排序,保留最大的两位,如果id相同就找交叉相选最大的,id不同直接输出最大的两个值相加。
#include #include #include using namespace std ;const int maxn=5 *1e6 +10 ;typedef long long ll;struct node {ll val;ll va;ll vb;int id; }s[maxn];bool cmp1(node a,node b) {return a.va>b.va; }bool cmp2(node a,node b) {return a.vb>b.vb; }int main() {int t,kcase=0 ;int a,b,n;scanf ("%d" ,&t);while (t--){scanf ("%d%d%d" ,&n,&a,&b);for (int i=0 ;iscanf("%lld" ,&s[i].val);s[i].va=s[i].val*s[i].val*a;s[i].vb=s[i].val*b;s[i].id=i;}node a1,a2,b1,b2;ll ans;sort(s,s+n,cmp1);a1=s[0 ];a2=s[1 ];sort(s,s+n,cmp2);b1=s[0 ];b2=s[1 ];if (a1.id!=b1.id) ans=a1.va+b1.vb;else {ans=max(a1.va+b2.vb,a2.va+b1.vb);}printf ("Case #%d: " ,++kcase);printf ("%lld\n" ,ans);}return 0 ; }