Largest Point (2015沈阳赛区网络赛水题)

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

题目大意:给出一系列的数t,给出a、b,找出最大的a*ti2+b*tj,其中,i<>j。

题目分析:将a*ti2和b*tj分别存放在两个数组中,排下序并找出最大的。若两个最大的下标不相同,则和即为答案;若相同,再找两个次大的,求来自不同数组的最大的加次大的的和,再取二和之中大的便是答案。

代码如下:

# include<iostream>
# include<cstdio>
# include<cstring>
# include<vector>
# include<map>
# include<set>
# include<list>
# include<cstdlib>
# include<string>
# include<iomanip>
# include<algorithm>
using namespace std;
# define LL long double
struct arr
{
    LL val;
    int id;
    arr(){}
    arr(LL a,int b):val(a),id(b){}
    bool operator < (const arr& a) const {
        return val<a.val;
    }
};
arr w1[500005],w2[500005];
int main()
{
    int T,a,b,n,cas=0;
    scanf("%d",&T);
    while(T--)
    {
        int k;
        scanf("%d%d%d",&n,&a,&b);
        for(int i=0;i<n;++i){
            scanf("%d",&k);
            w1[i]=arr((LL)a*(LL)k*(LL)k,i);
            w2[i]=arr((LL)b*(LL)k,i);
        }
        sort(w1,w1+n);
        sort(w2,w2+n);
        printf("Case #%d: ",++cas);
        if(w1[n-1].id!=w2[n-1].id)
            cout<<fixed<<setprecision(0)<<w1[n-1].val+w2[n-1].val<<endl;
        else{
            LL ans1=w1[n-1].val+w2[n-2].val;
            LL ans2=w1[n-2].val+w2[n-1].val;
            cout<<fixed<<setprecision(0)<<max(ans1,ans2)<<endl;
        }
    }
    return 0;
}

  

时间: 2024-10-17 09:12:17

Largest Point (2015沈阳赛区网络赛水题)的相关文章

hdu5442(2015长春赛区网络赛1006)后缀数组+KMP /最小表示法?

题意:给定一个由小写字母组成的长度为 n 的字符串,首尾相连,可以从任意一个字符开始,顺时针或逆时针取这个串(长度为 n),求一个字典序最大的字符串的开始字符位置和顺时针或逆时针.如果有多个字典序最大的字符串,优先选择开始位置靠前的,如果开始位置相同,优先选择顺时针. 这种字符串的问题,第一反应是后缀数组,为了达到首尾相连的目的,所以先复制了一个两倍长的该字符串,然后再将串倒置,也弄成两倍长度,得到顺逆时针的两倍长的串,并对这两个字符串分别做后缀数组,得到 sa 数组(该串字典序第几小的后缀的开

hdu5443(2015长春赛区网络赛1007)暴力

题意:给了一个数列,有多个询问,每个询问求某个区间内的最大值 数列长度 1000,询问个数 1000,静态,并不需要RMQ这些,直接暴力 n2 查找每个询问区间取最大值就行了. 1 #include<stdio.h> 2 #include<string.h> 3 #include<algorithm> 4 #include<math.h> 5 using namespace std; 6 typedef long long ll; 7 const int m

hdu5441(2015长春赛区网络赛1005)类最小生成树、并查集

题意:有一张无向图,一些点之间有有权边,某条路径的值等于路径上所有边的边权的最大值,而某个点对的值为这两点间所有路径的值的最小值,给出多个询问,每个询问有一个值,询问有多少点对满足其值小于等于询问值.点的顺序不同算作不同点对. 这题的做法很类似Kruskal算法.一开始所有的点都为一个并查集,从权值最小的边开始,当加入这条边的时候,这条边连接的两个点(并查集)之间相互到达的路径中,值最小的一个路径一定就是通过这条边的,所以这两点间的值就是这条边的权值.之后每加入一条最小边,如果可以用来合并两个并

HDU 5894 hannnnah_j’s Biological Test (组合数学) -2016 ICPC沈阳赛区网络赛

题目链接 题意:一个大小为 nn 的环,选 mm 个位置涂黑,要求相邻两个黑点之间至少间隔 kk 个白点,问方案数. 题解:考虑从 0 开始的标号最小的涂黑的位置,有两种情况: 如果该位置 \geq k≥k,相当于在一排(不是环) n - kn−k 个椅子里面放 mm 个人:如果该位置 < k<k, 相当于在一排 n - 2k - 1n−2k−1 个椅子里面放 (m - 1)(m−1) 个人.这种情况有 k 种. 最后考虑在一排 nn 个椅子里面放 mm 个人的方案数,相当于要找 (m + 1

HDU 5901 Count primes (1e11内的素数个数) -2016 ICPC沈阳赛区网络赛

题目链接 题意:求[1,n]有多少个素数,1<=n<=10^11.时限为6000ms. 官方题解:一个模板题, 具体方法参考wiki或者Four Divisors. 题解:给出两种代码. 第一种方法Meisell-Lehmer算法只需265ms. 第二种方法不能运行但是能AC,只需35行. 第一种: //Meisell-Lehmer #include<cstdio> #include<cmath> using namespace std; #define LL long

HDU 4002 Find the maximum (欧拉函数-积性函数的性质(2011年大连赛区网络赛第二题)

[题目链接]:click here~~ [题目大意]: 给出一个整数n,求一个数x,x在1到n之间,并且x/φ(x)最大(其中φ(x)为x的欧拉函数). [思路]: 由欧拉函数为积性函数,即:如果 则有: 且: 则有: 要使f(x)最大,须使x含尽量多的不同素数因子. 代码: /* * Problem: HDU No.4002 * Running time: 1700MS * Complier: java * Author: javaherongwei * Create Time: 0:08 2

HDU5006 Resistance (2014年鞍山赛区网络赛J题)

1.题目描述:点击打开链接 2.解题思路:本题利用缩点+高斯消元解决.本题的最大特点就是电阻非零即一,如果电阻为0,说明零点之间是等电位点,可以看做一个整体,自然可以想到先利用并查集进行缩点操作,将复杂的电路图转化为不相等的电位点构成的电路图.如果转换完毕后,发现s和t在一个集合中,说明两点之间是等电位的,等效电阻为0,否则,对转换后的图G'重新判断连通性,依然可以利用并查集解决,如果发现不连通,说明s与t之间开路,电阻为inf,否则,就可以根据tot个点的电位列写方程. 我们令有1A的电流从点

hdu 4031 2011成都赛区网络赛A题 线段树 ***

就是不知道时间该怎么处理,想了好久,看了别人的题解发现原来是暴力,暴力也很巧妙啊,想不出来的那种  -_-! 1 #include<cstdio> 2 #include<iostream> 3 #include<algorithm> 4 #include<cstring> 5 #include<cmath> 6 #include<queue> 7 #include<map> 8 using namespace std; 9

hdu5024 网络赛水题

不用多想  暴力撸就行     枚举每个点   向四周延伸的两条最远距离   最多能转一次90度的弯 #include<stdio.h> #include<string.h> #include<iostream> using namespace std; int dir[8][2]={0,1, 0,-1, 1,0, -1,0, 1,1, 1,-1, -1,1, -1,-1}; int xia[8][2]={1,0, -1,0, 0,-1, 0,1, 1,-1, -1,-