分析:
1.总和不为0:至少有一个不为0的数。
2.总乘积不为0:所有数都不能为0.
举例:1 2 3 0 0 0,为满足以上条件,我们尽量将0都+1 —>1 2 3 1 1 1.
分析结果:我们尽量让数据中的“0”不存在,以保证以上条件都满足。
问题:
那对于总和而言,-1 -1 1 1似乎就不成立了,虽然至少有一个不为0的数,但总和仍为0.
解决思路:
1.设定一个操作数—->operations=0;(意为将该数+1),我们不需要去想到底该将哪个数+1,这不是我们解题的方向。
2.为了让“0”不存在,那么有多少“0”,就操作多少次,所以我们要记录“0”的数量总和—-> zero_count=operations;
3.由于存在问题(非负数加正数可能为0)即—-> sum=0时,比如:-1 -1 1 1,虽然乘积不为0,但它的总和却重新回到0,没关系,我们只需要让操作数+1,使得某个数变动,那总和结果就不为0了。—->operations++;
初步代码:
for(int i=1;i<=n;++i)
{
cin>>number[i];
if(number[i]0)
zero_count++;//0的总数量
}
while(t–){
int n,operations=0,zero_count=0,sum=0;
cin>>n;
operations=zero_count;//操作数为0的总数量
if(sum0)//比如-1 -1 1 1
operations++;
cout<<operations<<endl;
这样的话答案是错误的,我们确实考虑了正负数相加可能为0的情况,但是我们忽略了一开始全0的情况:
0 0 0 —->zero_count=3—->operations=3—->1 1 1;(这是真正的答案)
已经满足总和不为0,乘积不为0;
但是此时sum仍然为0(我们并没有对它实际操作+1)
所以会进入if(sum0)—->operation++——>operation=4;(这是错误的答案)
最小的操作数为3,在这里却变成4,显然是错误de
那么我们只需要限制它们,使得全0的情况不能进入if语句即可
if(sum+zero_count0)//(0 0 0)不满足条件进不去,(-1 -1 1 1 )满足条件可进
operations++;
cout<<operations<<endl;