记录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=几何平均数(GM):
GM=算术平均数和几何平均数的关系
根据算术平均数-几何平均数不等式(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=![]()
此时,乘积 P 为:
P=![]()
如果某些数不相等,例如 a1
a2,则根据AM-GM不等式,乘积会小于上述值。因此,为了最大化乘积,所有数应该尽可能接近。
举例说明
假设 N=10,M=3,我们需要找到3个正整数,它们的和为10,且乘积最大。
数字相近的情况:
选择 3,3,4:
3+3+4=10 3⋅3⋅4=36数字不相近的情况:
选择 1,2,7:
1+2+7=10 1⋅2⋅7=14可以看到,数字相近时(3, 3, 4)的乘积(36)比数字不相近时(1, 2, 7)的乘积(14)要大。
总结
当数字相近时,乘积最大,因为根据AM-GM不等式,当所有数都相等时,几何平均数达到最大值,从而乘积也达到最大值。
乘积最大问题解析
650

被折叠的 条评论
为什么被折叠?



