2018TYUT暑期ACM模拟赛(10)
Largest Point HDU - 5461
思路:一个结构体直接保存t*t*a和t*b,利用两个比较函数将两个值分别进行从小到大排序,保留最大的两位,如果id相同就找交叉相选最大的,id不同直接输出最大的两个值相加。
#include<iostream>
#include<cstdio>
#include<algorithm>
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;i<n;i++)
{
scanf("%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);//t*va//最大的
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;
}