题解 CF1206B 【Make Product Equal One】

这个题实际上就是一个不是很裸的贪心

然而我比赛时还是WA了2次

这个首先要注意的是,要开long long;

至于思路,很明显,<0的我们全部改成-1,>0的全部改成1,0统计数量,最后把所有的±1乘起来,如果有0的话则是不用管是不是1的,因为可以通过修改一个0来达到把-1变成1;否则的话要把其中一个-1变为1,即再加上2的答案。

代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include<bits/stdc++.h>
using namespace std;
int n,s=1,cntz;
long long ans,a[100005];
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cin>>n;
for (int i=1;i<=n;i++){
cin>>a[i];
if(a[i]<0)ans+=-1-a[i],a[i]=-1;//<0的变成-1
else if(a[i]==0)ans++;//=0的肯定是要动1次的
else ans+=a[i]-1,a[i]=1;//>0的改成1
}
for (int i=1;i<=n;i++)if(a[i])s*=a[i];else cntz++;//统计乘积和0的个数
if(s==-1&&!cntz)ans+=2;//如果乘起来是-1,又没有可以动手脚的0,则要把其中一个-1改为1,再额外加上2
cout<<ans;
}