这题其实可以数学方法差小积大解决。
差越小积越大,那肯定是让最小的数加一啦。将所有数的积除以最小值再乘上最小值加一。
#include<bits/stdc++.h>
using namespace std;
signed main(){
int T;
cin>>T;
while(T--){
long long cnt=0,n,a[10],minn=LONG_LONG_MAX,ans=1;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
ans*=a[i];
minn=min(minn,a[i]);
}
cout<<ans/minn*(minn+1)<<endl;
}
return 0;
}
然而 \(a_{i}\) 可能为 \(0\)。
于是我统计了 \(0\) 的个数,进行分类讨论:
如果 \(0\) 的个数不小于 \(2\),则输出 \(0\),因为怎么加都会有一个 \(0\)。
如果 \(0\) 的个数等于 \(1\),则输出 所有数除 \(0\) 外的积,因为 \(0\) 改变后的值为一。
否则没有 \(0\),就正常输出。
AC Code
#include<bits/stdc++.h>
using namespace std;
signed main(){
int T;
cin>>T;
while(T--){
long long cnt=0,n,a[10],minn=LONG_LONG_MAX,ans=1;
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
if(a[i])ans*=a[i];
else cnt++;
minn=min(minn,a[i]);
}
if(cnt>=2)cout<<0<<endl;
else if(cnt==1)cout<<ans<<endl;
else cout<<ans/minn*(minn+1)<<endl;
}
return 0;
}
标签:cnt,minn,int,题解,LONG,long,ans,CF1873B
From: https://www.cnblogs.com/xdh2012/p/17771830.html