题目:
样例:
 
   | 
| 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;
} 




















