标签:
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; }
标签:
原文地址:http://www.cnblogs.com/Emerald/p/4823232.html