CF1873B题解

发布时间 2023-10-18 13:03:11作者: Xu_dh

这题其实可以数学方法差小积大解决。

差越小积越大,那肯定是让最小的数加一啦。将所有数的积除以最小值再乘上最小值加一。

#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;
}