
交换之后,ans_exchanged=ans_init+2*(被交换偶数-被交换奇数)
因此,遍历偶数组,得到其减去奇数组中最小项的差,找出最大的差
注意是差最大而不是最大的偶数项减去最小的奇数项
注意最后要和不交唤的情况进行比较判断
- #include
- using namespace std;
- using ll = long long;
- const int n=1e6+10;
- int arr[n];
- vector<int> arr_double;
- vector<int> arr_single;
- int main(){
- int N;cin>>N;
- bool flag=true;
- ll ans_init=0;
- for(int i=1;i<=N;i++){
- cin>>arr[i];arr[i]=abs(arr[i]);//交替和各项都为绝对值
- if(flag){
- ans_init+=arr[i];
- arr_single.push_back(arr[i]);//奇数组
- flag=false;
- }else{
- ans_init-=arr[i];
- arr_double.push_back(arr[i]);//偶数组
- flag=true;
- }
- }
- sort(begin(arr_single),end(arr_single));
- //奇数和-偶数和,把小的奇数与比它大的偶数交换,交换之后ans_exchanged=ans_init+2*(偶数-奇数),找到最大的ans_exchanged
- ll subtract_max=LLONG_MIN;
- for(auto i:arr_double){
- if(i-arr_single[0] > subtract_max) subtract_max=i-arr_single[0];
- }
- cout<<max(ans_init+2*subtract_max,ans_init);//不要忘记和不交换的情况比较
- return 0;
- }