题目:样例:
|
5 4 2 0 |
思路:
这里的题意就是,
当我们 i 取奇数的时候,可以获得该奇数 i 的值,并去掉当前卡牌。
当我们 i 取偶数的时候,去掉当前卡牌。
这里我们去掉当前卡牌后,后面的卡牌下标 i 就会变化,后面的 i 的奇偶性就会变化。
所以当我们一个一个从后面开始取数的时候,就可以巧妙的避开这些变化,之后就是贪心操作。
代码详解如下:
#include <iostream>
#include <vector>
#include <unordered_set>
#include <unordered_map>
#define endl '\n'
#define int long long
#define YES puts("YES")
#define NO puts("NO")
#define umap unordered_map
#define uset unordered_set
#pragma GCC optimize(3,"Ofast","inline")
#define ___G std::ios::sync_with_stdio(false),cin.tie(0), cout.tie(0)
using namespace std;
const int N = 2e6 + 10;
inline void solve()
{
int n;
cin >> n;
umap<int,int>a; // 存储卡牌数值
for(int i = 1;i <= n;++i)
{
cin >> a[i];
}
// now 是取得的值多少
int now = 0,ans = 0;
// 开始贪心取值
// 从后面开始取值,是因为当我们取一个 i 值后
// 后面的 下标 i 就会变化,我们从后面 i 开始取值
// 巧妙的避开这些变化
for(int i = n;i > 0;--i)
{
// 当我们取得的 i 是偶数的时候
if(i % 2 == 0)
{
// 更新我们的ans
ans = max(ans,now);
}else
{
// 当我们取的 i 是奇数的时候,说明当前的 a[i] 也是可取的
// 继续更新 ans
ans = max(ans,a[i] + now);
}
// now 取值,我们只取 >= 0 更好的数值
now += max(a[i],(int)0);
}
// 输出答案
cout << ans << endl;
}
signed main()
{
// freopen("a.txt", "r", stdin);
___G;
int _t = 1;
cin >> _t;
while (_t--)
{
solve();
}
return 0;
}