本题解同步发布于[本场总题解](https://www.luogu.org/blog/expect/CF580DIV2),欢迎来踩


B - Make Product Equal One

要让个数乘积为,必须保证这个数列中只有或者,且的个数为偶数个。

考虑贪心,设代表变为的代价,代表变为的代价,优先选择小的一个,同时记录,如果选择的是,令计数器

如果为偶数,则直接输出答案

否则需要且仅需要将一个改为或将一个改为

升序排序,答案加上即可。

code:

#include<bits/stdc++.h>
using namespace std;
#define maxn 100005
#define int long long
int n,m;
int a[maxn];
int b[maxn];
int c[maxn];
int record[maxn],ans,cnt;
signed main(){
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        b[i]=abs(1-a[i]);
        c[i]=abs(-1-a[i]);
        if(b[i]<=c[i]){
            ans+=b[i];
            record[i]=c[i]-b[i];
        } 
        else{
            ans+=c[i];cnt++;
            record[i]=b[i]-c[i];
        }
    }
    sort(record+1,record+n+1);
    if(cnt%2==1) ans+=record[1];
    cout<<ans<<endl;
    return 0;
}