poj 1032 Parliament (整数拆分)
2015-08-11 19:40
78 查看
/* 题意:将n拆分为若干个数,使得这些数的乘积最大。 若将n拆成两个数,有如下两个规律: 1、只要不拆成1和n-1,拆出来的数的乘积一定比n大。 2、拆出来的数越接近n/2,两数乘积越大。 有了这两个规律,就可以琢磨本题的做法了。 首先,n要拆的越多越好,但是不能拆出1,所以最好是都拆成2。但是题目要求拆出来的数不能相同,所以构造的时候,先从2开始按公差为1的等差数列进行构造,可能当构造了cnt个数之后,n被用的只剩left,并且不足以构造第cnt+1个数了,换句话说就是剩下了left需要被加到已经构造好的数中去。 最好的方案当然是从大的开始,一次加1,所以需要考虑一下两种情况: 1、如果left<=cnt,就从高到低加1知道left==0为止。 2、如果left>cnt,cnt个数都先加1,left-=cnt,然后重复上一种情况。 */ # include<stdio.h> # include<algorithm> # include<string.h> using namespace std; int i; int a[1010]; void out() { for(int j=1; j<=i; j++) { if(j==i) printf("%d\n",a[j]); else printf("%d ",a[j]); } } int main() { int n,j; while(~scanf("%d",&n)) { n-=2; a[1]=2; for(i=2;; i++) { a[i]=a[i-1]+1; n-=a[i]; if(n-a[i]-1<0) break; } if(n==0) out(); else if(n<=i) { for(j=i; n>0; j--) { a[j]++; n--; } out(); } else { for(j=1; j<=i; j++) { a[j]++; n--; } for(j=i; n>0; j--) { a[j]++; n--; } out(); } } return 0; }
相关文章推荐
- hdu 3572 Task Schedule(最大流&&建图经典&&dinic)
- [POJ 1679] The Unique MST 最小树
- iOS开发-Day13-OC基础、面向对象
- 从错误中学python(2)————字符串转浮点数
- PAT 1038. Recover the Smallest Number (30)
- 使用java的迭代器对list进行遍历
- windows wim
- eclipse store password unencrypted
- Serverlet搭建
- JavaScript学习笔记5
- MYSQL隔离级别介绍
- #笔记#圣思园 JavaWeb 第65讲——jQuery,选择器
- 《Java开发实战经典》第三章答案3.3
- 机器学习:正则化
- sunburnt 学习笔记 (二) solr配置的简单说明
- 241 Different Ways to Add Parentheses(C代码版)
- 任务栈Task的模式
- 第3章面向对象(上)
- 《Java开发实战经典》第三章答案3.2
- NOIP2013 D1 T2 国王游戏