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

求一组数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;
}


 

你可能感兴趣的:(poj 1032 Parliament(正整数拆分不同数使乘积最大))