poj 1032 整數拆分

2022-05-06 11:51:12 字數 1584 閱讀 7008

好吧,又抄了一篇,嘿嘿--

給你乙個n問求使得 a1+a2+..ak==n時 a1*a2*..ak最大。。a1 a2.....不相等。(沒看懂題目意思。。)----我也沒看懂

以下**

思路:將乙個數分成2份,如何分,使得這兩個數乘積最大。答案是將這個數平分,證明是求x*(n-x)的最大值。基於這種思路,將n分成乘積最大的不相等的多份,應使得其中每份的數相差盡量少,即差值為1的等差數列為最理想狀態。構造了乙個等差數列以後,再根據剩餘值對整個數列的值進行調整。使得相鄰元素差值達到最小。這裡注意,等差數列的構造應以2為首項,1為首項的話,對乘積沒影響。。。

(以下證明是從網上得來的)

由題意知,這種分解的數目是有限的,因此,最大積存在;

假設最大積的分解為:

n=a1+a2+a3+…+a[t-2]+a[t-1]+a[t] (t是分解的數目,a11;

如果a1=1,則a1和a[t]可以由a[t]+a1=a[t]+1來替代,從而得到更大的積;

2)對於所有的i,有a[i+1]-a[i]<= 2;

如果存在i使得a[i+1]-a[i]>=3,則a[i]和a[i+1]可以替換為a[i]+1,a[i+1]-1,從而使乘積更大;

3)最多隻存在乙個i使得a[i+1]-a[i]=2;

如果i< j且a[i+1]-a[i]=2、a[j+1]-a[j]=2,則a[i],a[j+1]可以替換為a[i]+1,a[j+1]-1,從而使得乘積更大;

4)a1<=3;

如果a1>=4,則a1和a2可以替換為2,a1-1,a2-1,從而使得乘積更大;

5)如果a1=3且存在i滿足a[i+1]-a[i]=2,則i一定等於t-1;

如果i將上面5條性質綜合一下,得到該數列滿足:

1)1< a1< 4

2)a[i+1]-a[i] <=2(該序列按公升序排序)

3)a[i+1]-a[i]=2的情況最多只有乙個

因此,我們得到最大的乘積的做法就是求出從2開始的最大連續(由上面總結的性質2和3可知)自然數列之和a,使得a的值不超過n,具體分析如下:

對輸入的n,找到k滿足:

a=2+3+4+...+(k-1)+k <= n < a+(k+1) = b

假設n=a+p(0<=p< k+1),即a+p是最大積的數列

1)p=0,則最大積是a;

2)1<=p<=k-1,則最大積是b-,即從數列的最大項i開始,從大到小依次每項加1,知道p=0為止;

3)p=k,則最大積是a+p=a+k=a-+;( =3+4+...+k+( k+2) );

#include #include #include using namespace std;

int n;

int p[1000];

int main()

s=s-p[len-1]-1;

int rem=n-s;

for(int i=0;iif(rem==len+1)p[len-1]+=1;

for(int i=0;iif(i==0)printf("%d",p[i]);

else printf(" %d",p[i]);

printf("\n");

}return 0;

}

poj 1032 整數拆分

給你乙個n問求使得 a1 a2 ak n時 a1 a2 ak最大。a1 a2.不相等。沒看懂題目意思。以下 思路 將乙個數分成2份,如何分,使得這兩個數乘積最大。答案是將這個數平分,證明是求x n x 的最大值。基於這種思路,將n分成乘積最大的不相等的多份,應使得其中每份的數相差盡量少,即差值為1的...

poj 1032 拆分數字使乘積最大

參考 題意 給出乙個數n,將其拆分為若干個互不相等的數字的和,要求這些數字的乘積最大。分析 我們可以發現任何乙個數字,只要能拆分成兩個大於1的數字之和,那麼這兩個數字的乘積一定大於等於原數。也就是說,對於連乘式中,如果將乙個乘數a更換為兩個數字b c a b c且b 1,c 1 那麼乘積只可能增大或...

POJ 1032 解題報告

p.s.之前按照列表做,做著做著就做岔了。這裡回歸正軌。這道題後來做成了找規律題 我用遞迴搜尋不出意外地tle了 discuss 上面有好些關於規律的討論和證明,比如 知道後就簡單了很多了。這裡參考了的規律總結。thestoryofsnow 1032 accepted 144k 0msc 1028b...