这是我的原始代码
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 9;
int a[N];
int main()
{
int n;cin >> n;
for (int i = 1; i <= n; i++)cin >> a[i];
int ans = 0;
sort(a+1,a+1+n);
if (n % 2 == 0)
{
for (int i = 1; i <= n; i++) ans += a[i];
}
else
{
for (int i = 2; i <= n; i++) ans += a[i];
}
cout << ans << '\n';
return 0;
}
有个大问题就是没注意题目中价格也能取负数的,当然这个我现在也没想明白的。
改进后:
思路:
将数组从小到大排序,从后往前遍历两两相加,如果大于0,就累加到ans上,如果小于0,就break。
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 1e5 + 9;
ll a[N];
int main()
{
int n;cin >> n;
for (int i = 1; i <= n; i++)cin >> a[i];
ll ans = 0;
sort(a+1,a+1+n);
for (int i = n; i >= 1 && i-2 >= 1; i -= 2)
{
ll tmp = a[i] + a[i-1];
if(tmp >= 0)
ans += tmp;
else break;
}
cout << ans << '\n';
return 0;
}