hdu 5461 Largest Point

Thinking about it:

  对于式子 a * ti * ti + b * tj,可以看作时有两部分构成 a * ti * ti 和 b * tj,如果整个式子要最大,则要求这两部分都要尽量大。那么再读入数据 t 时,那么就可以构造两个数组,一个存储a * ti * ti ,另一个存储 b * tj。在选取时就产生了两种方案:

  1. 先选取 a * ti * ti 最大的,接着再 i != j 的基础上, 选择 b * tj 最大的。

  2. 先选取 b * tj 最大的,接着再 i != j 的基础上, 选择 a * ti * ti 最大的。 

可以算出两种情况下的值,比较大小三即可。

 

PS:

  最开始我的办法是求出 t 中的 最大值,绝对值最大值,最小值,绝对值最小值,根据a,b正负等情况分类讨论。就运算时间上,这种方法一般会更快点,不过要把情况仔细。

 

Code:

#include <bits/stdc++.h>

using namespace std;

typedef long long LL;

const int MAXN = 5 * 10e6 +50;
LL N, a, b;
LL sub_a[MAXN], sub_b[MAXN];

LL way(LL first[], LL second[]) {
    LL ans = (LL)MAXN * MAXN * -1;
    int pos;
    for (int i = 0; i < N; ++i) {
        if (first[i] > ans) {
            ans = first[i];
            pos = i;
        }
    }
    LL maxC = (LL)MAXN * MAXN * -1;
    for (int i = 0; i < N; ++i) {
        if (second[i] > maxC && i != pos) {
            maxC = second[i];
        }
    }
    return ans + maxC;
}

int Case = 0;
void work() {
    cin >> N >> a >> b;
    LL tmp;
    for (int i = 0; i < N; ++i) {
        cin >> tmp;
        sub_a[i] = tmp * tmp * a;
        sub_b[i] = tmp * b;
    }
    cout << "Case #" << (++Case) << ": " << max(way(sub_a, sub_b), way(sub_a, sub_b)) << endl;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);
    int T;
    cin >> T;
    while (T --) {
        work();
    }
    return 0;
}

  

posted @ 2015-09-20 12:50 Emerald 阅读(...) 评论(...) 编辑 收藏