P1887 乘积最大3

乘积最大问题解析

记录5

#include <bits/stdc++.h>
using namespace std;
int main() {
	int n,m;
	cin>>n>>m;
	if(n%m==0){  //n可以均分在m中
		int cnt=m;	
		while(cnt--){
			cout<<n/m<<' ';
		}
	}else{   //不能均分时,按多的余数再分
		int x=n%m;
		int cnt=m-x;
		while(cnt--) cout<<n/m<<' ';
		while(x--) cout<<n/m+1<<' ';
	}
    return 0;
}

突破点

输出格式

M 个和为 N 的,乘积尽可能的大的正整数。

思路

让m个数都差不多大,这样m个数乘起来的乘积就是最大的,数学证明放在文章末尾补充

代码简解

else{   //不能均分时,按多的余数再分
		int x=n%m;
		int cnt=m-x;
		while(cnt--) cout<<n/m<<' ';
		while(x--) cout<<n/m+1<<' ';
	}

当n个东西能均分在m个盒子中时候,属于简单情况,直接无情输出n/m就行

不能均分时,注意到多出来的余数肯定是不足m个盒子的,所以从后向前摆放就行

多出来的不过是n/m+1

注意点:

        int cnt=m;	
		while(cnt--){
			cout<<n/m<<' ';
		}

在均分情况下,必须用新变量接收m,因为直接使用m计数的话,会导致n/m的值不正确

字典序是从小到大

补充

要理解为什么当数字相近时乘积最大,我们可以从数学的角度进行分析。这个问题可以通过一个简单的数学原理来解释:算术平均数和几何平均数的关系

算术平均数和几何平均数

对于一组正数 a1​,a2​,…,aM​,它们的算术平均数(Arithmetic Mean, AM)和几何平均数(Geometric Mean, GM)定义如下:

  • 算术平均数(AM)

    AM=\tfrac{a1+a2+...+aM}{M}
  • 几何平均数(GM)

    GM=\sqrt[M]{a1+a2+...aM}

算术平均数和几何平均数的关系

根据算术平均数-几何平均数不等式(AM-GM不等式),对于任意一组正数 a1​,a2​,…,aM​,有:

AM≥GM

等号成立当且仅当所有数都相等,即 a1​=a2​=⋯=aM​。

通俗解释

假设我们有 M 个正整数,它们的和为 N,即:

a1​+a2​+⋯+aM​=N

我们希望最大化它们的乘积:

P=a1​⋅a2​⋅⋯⋅aM​

根据AM-GM不等式,当所有数都相等时,几何平均数达到最大值。换句话说,当所有数都相等时,乘积 P 也达到最大值。

数学推导

假设所有数都相等,即:

a1​=a2​=⋯=aM​=\frac{N}{M}

此时,乘积 P 为:

P=\frac{N}{M}^M{}

如果某些数不相等,例如 a1​\neqa2​,则根据AM-GM不等式,乘积会小于上述值。因此,为了最大化乘积,所有数应该尽可能接近。

举例说明

假设 N=10,M=3,我们需要找到3个正整数,它们的和为10,且乘积最大。

  1. 数字相近的情况

    • 选择 3,3,4:

      3+3+4=10             3⋅3⋅4=36
  2. 数字不相近的情况

    • 选择 1,2,7:

      1+2+7=10            1⋅2⋅7=14

可以看到,数字相近时(3, 3, 4)的乘积(36)比数字不相近时(1, 2, 7)的乘积(14)要大。

总结

当数字相近时,乘积最大,因为根据AM-GM不等式,当所有数都相等时,几何平均数达到最大值,从而乘积也达到最大值。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值