Largest Point HDU - 5461

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;
}

猜你喜欢

转载自blog.csdn.net/Miranda_ymz/article/details/81671853