|
5 4 2 0 |
这里的题意就是,
当我们 i 取奇数的时候,可以获得该奇数 i 的值,并去掉当前卡牌。
当我们 i 取偶数的时候,去掉当前卡牌。
这里我们去掉当前卡牌后,后面的卡牌下标 i 就会变化,后面的 i 的奇偶性就会变化。
所以当我们一个一个从后面开始取数的时候,就可以巧妙的避开这些变化,之后就是贪心操作。
- #include
- #include
- #include
- #include
- #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;
- }