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

      

  • 相关阅读:
    MAC上Vue的一些安装及配置
    MySQL
    git
    win7系统的用户怎么去掉用户账户控制?
    JS
    IDEA使用总结
    Mybatis
    codeforces cf educatonal round 57(div2) D. Easy Problem
    codeforces round#509(div2) E. Tree Reconstruction
    codeforces round#509(div2) D. Glider
  • 原文地址:https://www.cnblogs.com/Emerald/p/4823232.html
Copyright © 2020-2023  润新知