P9852 [ICPC2021 Nanjing R] Windblume Festival 题解

· · 题解

做法模拟

题意:一个长为 n 的环形数组,每次操作对于任意 i,j,删除 a_j,将 a_i 减去 a_j,使得最后剩余的数最大。

思路:由题意可知,一次操作即将两数合并为两数之差。因此假设按操作先后顺序, a_1 表示最后一个操作的数, a_n 表示第一个操作的数,题意即为将 a_1a_n 连成一个算式,在每个数之前添加一个符号,使得算式值最大。

代码

#include<bits/stdc++.h>
#define ll long long
#define INF -0x7f7f7f7f
using namespace std;
const int N=1e6+10;
ll T,n,a[N];
int main(){
    cin>>T;
    while(T--){
        cin>>n;
        ll sum=0,ans=INF;
        for(int i=1;i<=n;i++){
            cin>>a[i];
            sum+=abs(a[i]);//统计最大可能达到的值
        }
        if(n==1){//特判
            cout<<a[1]<<"\n";
            continue;
        }
        for(int i=1;i<=n;i++){
            ans=max(ans,sum-abs(a[i])-abs(a[i%n+1])+a[i]-a[i%n+1]);//sum减去两数的绝对值,加上做差后的值,即为每次操作的贡献
        }
        cout<<ans<<"\n";
    }

    return 0;
}

后记:如有错误或不足请 dalao 指出。(点个再走呀!