乘积最大的拆分
2015-11-02 23:53
197 查看
将正整数n拆分为若干个互不相等的自然数之和,问如何拆分可以使得它们的乘积最大?
小学奥数。。。(感到深深的惶恐)
若答案里有1的话还不如把1加到最后,那么最少是2。
若相邻两个差大于2,不如化成x[i]+1和x[i+1]-1,所以相邻两数之差不大于2。
于是就从2开始找,直到加到i>=n
若sum+i>n,答案从i-1往前一次加1,直到和为n
小学奥数。。。(感到深深的惶恐)
若答案里有1的话还不如把1加到最后,那么最少是2。
若相邻两个差大于2,不如化成x[i]+1和x[i+1]-1,所以相邻两数之差不大于2。
于是就从2开始找,直到加到i>=n
若sum+i>n,答案从i-1往前一次加1,直到和为n
#include<stdio.h> #include<algorithm> using namespace std; int n; int cnt; int ans[15000]; int main() { scanf("%d",&n); if(n==1)printf("1\n");//坑坑坑坑坑!!!!! int sum=0; int left=0; for(int i=2;i<=n;i++) { ans[cnt++]=i; sum+=i; if(sum>n) { sum-=i; cnt--; left=n-sum; break; } } for(int i=cnt-1;left;left--) { ans[i]++; i--; if(i<0)i=cnt-1; } for(int i=0;i<cnt;i++) { if(i==0)printf("%d",ans[i]); else printf(" %d",ans[i]); } return 0; }
相关文章推荐
- ListView学习
- background总结
- Hbase的安装(hadoop-2.6.0,hbase1.0)
- Android数据通信--USB通信的几种方式及使用场景
- ACM 简易的自动测试命令
- 安卓项目开发
- 日期时间选择插件 - laydate.js
- leetcode笔记:Maximum Subarray(最大子串和问题)
- cocoapod error diff
- Java和Jsp中获取类所在路径(绝对路径、相对路径)的几种方法
- 没有什么好神秘的: wait_on_page_bit
- 特性(C#)
- 特性(C#)
- 新浪微博
- Eclipse的logcat只显示Level栏内容
- Kendall tau距离:求两个排列之间的逆序数
- 顺序容器--容器库.迭代器
- 自定义maven项目模板-脚手架
- 第二百一十四天 how can I 坚持
- 熟悉预处理标识符: __LINE__ __FILE__ __DATE__ # ##