贪心
先找价值为正的商品,对邻接时的奇偶情况进行讨论。
先找价值为正的商品,就是一种常见的贪心策略。
那临界情况是啥?
比如:1、2、3、4、5、6的临界情况就是在i = 1的时候,
-1、0、1、2、3的临界情况就是在i = 3的时候,
-3、 -2、-1 、1、2、3的临界情况就是在i = 3的时候。(数组下标从1取起)
所以临界情况就是数组将要读完的情况,或者数组将要变小的情况。
先对数组进行从小到大的排序,然后从后向前一个一个累加。碰到临界情况时,由此时奇偶数量和下一个数的大小,来决定下一步的操作。
只要细心一点,把所有的情况想到就行。
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int maxn = 1e5 + 9;
ll a[maxn];
int main(){
int n; cin >> n;
for (int i = 1; i <= n; i++) cin >> a[i];
sort(a + 1, a + n + 1);
ll ans = 0;
int cnt = 0;
for (int i = n; i >= 1; i--) {
if (a[i - 1] <= 0 && i == 1) break;
else if (cnt % 2 == 0 && ans + a[i] > ans) {
ans += a[i];
cnt++;
}
else if (cnt % 2 == 0 && ans + a[i] <= ans) break;
else if (cnt % 2 != 0 && ans + a[i] <= ans && a[i + 1] <= abs(a[i])){
ans -= a[i + 1];
break;
}
else if (cnt % 2 != 0 && ans + a[i] <= ans){
ans += a[i];
cnt++;
}
else if (cnt % 2 != 0 && ans + a[i] > ans){
ans += a[i];
cnt++;
}
}
cout << ans;
return 0;
}