poj 1032 Parliament(正整数拆分不同数使乘积最大)

来源:互联网 发布:金山数据恢复大师vip 编辑:程序博客网 时间:2024/06/08 06:28

求一组数2,3,...,w

1>.如果它们的和等于n,那么这组数就是使得乘积最大的数。

2>如果它们的和为sum,且n-sum==w,那么使得乘积最大的数为3,4,...,w,w+2,即前面几个数加1,最后一个数加2

3>如果它们的和为sum,且n-sum<w,那么就将这n-sum个1分别加到这组数的后n-sum个数上。

证明:http://blog.himdd.com/archives/1918

 http://yjq24.blogbus.com/logs/41658049.html

#include<stdio.h>#include<iostream>#include<string.h>#include<algorithm>using namespace std;int main(){int num[1010];int n,i,j,s,t,k,v;while(~scanf("%d",&n)){memset(num,0,sizeof(num));for(s=j=0,i=2;;i++){s+=i;num[j++]=i;if(s>n) break;}t=n-(s-i),v=i-1;//printf("%d %d\n",t,v);if(t==v){for(i=1;i<j-1;i++){printf("%d ",num[i]);}printf("%d",v+2);}else{for(i=t,k=j-2;i>0;i--,k--){num[k]+=1;}printf("%d",num[0]);for(i=1;i<j-1;i++){printf(" %d",num[i]);}}printf("\n");}return 0;}


 

0 0