P1249 最大乘积(讲题备用)
P1249 最大乘积 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)
这道题涉及到简单的贪心和数论以及高精度乘法
这道题我们要解决两个问题:1.求乘积最大时的每一项;2.求乘积(高精度)
首先这道题求:整数n分成若干个互不相同的自然数之和,使这些自然数的乘积最大
根据贪心的思想,一般是能分出的份数越多,乘积越大
所以我们可以从2开始累加,直到新的加数大于余数
拿15为例:
15:s=2+3+4+5此时余数是1,未来新的加数为6
对于余数,我们不难想有这样的结论:从大数开始向前,依次分配1,这样的乘积最大
那么把5+1就是最后的答案
那假设我们有m项(第m项值为m+1),从m+1项(第m+1项值为m+2)开始新的加数大于余数
那么此时最大的余数是m+1,也就是说此时加完一轮后还剩1,那把这个1给最大项即可
此外还要注意特判:1-4时,其本身就是最大值
高精度乘法:
为了方便使用高精度,我们在存储每一项时,用整形和字符串型存两次(整形是为了方便输出)
高精度乘有两个写法:
一个是借助高精度加法,把乘法转换为多次加法
一个是模拟竖式乘法
这里选用第二种,因为更加简短,大家也都有板子,这里不做过度解释
1 #include<iostream> 2 #include<algorithm> 3 using namespace std; 4 const int L=500; 5 //高精度乘法 6 string mul(string a,string b) 7 { 8 string s; 9 int na[L],nb[L],nc[L],La=a.size(),Lb=b.size(); 10 fill(na,na+L,0); 11 fill(nb,nb+L,0); 12 fill(nc,nc+L,0); 13 for(int i=La-1;i>=0;i--) na[La-i]=a[i]-'0'; 14 for(int i=Lb-1;i>=0;i--) nb[Lb-i]=b[i]-'0'; 15 for(int i=1;i<=La;i++) 16 { 17 for(int j=1;j<=Lb;j++) 18 { 19 nc[i+j-1]+=na[i]*nb[j]; 20 } 21 } 22 for(int i=1;i<=La+Lb;i++) 23 { 24 nc[i+1]+=nc[i]/10; 25 nc[i]%=10; 26 } 27 if(nc[La+Lb]) s+=nc[La+Lb]+'0'; 28 for(int i=La+Lb-1;i>=1;i--) 29 { 30 s+=nc[i]+'0'; 31 } 32 return s; 33 } 34 //把整形转换为字符串 35 string f(int a) 36 { 37 char ch[10],t; 38 int i=0; 39 int j; 40 while(a) 41 { 42 ch[i]=a%10+'0'; 43 a/=10; 44 i++; 45 } 46 ch[i]='\0'; 47 //字符数组的倒序 48 for(i=i-1,j=0;j<=i/2;j++,i--) 49 { 50 t=ch[i]; 51 ch[i]=ch[j]; 52 ch[j]=t; 53 } 54 return ch; 55 } 56 57 int n,a[1005]; 58 string s[1005]; 59 int c=1; 60 int main() 61 { 62 string m="1"; 63 //输入 64 cin>>n; 65 //特判 66 //如果n小于5,自己本身就是最优解 67 if(n<=4) 68 { 69 cout<<n<<endl<<n; 70 return 0; 71 } 72 //拆项 73 for(int i=2;i<=n;i++) 74 { 75 if(n>=i) 76 { 77 n-=i; 78 a[c++]=i; 79 s[c-1]=f(i); 80 } 81 else 82 break; 83 } 84 //如果有余数,从最高位开始加一 85 for(int i=c-1;i>=1;i--) 86 { 87 if(n>0) 88 { 89 a[i]++; 90 s[i]=f(a[i]); 91 n--; 92 } 93 } 94 //分过一轮后,如果还多,就让最后一个数加一,余数<=n 95 if(n>0) 96 { 97 a[c-1]++; 98 s[c-1]=f(a[c-1]); 99 } 100 //高精度乘 101 for(int i=1;i<c;i++) 102 { 103 //输出分出的整数 104 cout<<a[i]<<" "; 105 m=mul(s[i],m); 106 } 107 cout<<endl<<m; 108 return 0; 109 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY