給出乙個n,把n拆分成多個不同的數,要求他們的乘積最大,公升序輸出這樣的序列
/*
乙個數分成兩部分,要使得乘積最大必然是兩部分越接近越好
例如9分成4+5,這必然是分成兩份的所有方法中最大的;
然後我們 對於 5,我們發現 5分成2+3, 會 有 2*3>5,所以5還可以分,
也就是對於x分成兩份,x=y+z,其中如果y或z可以再分成兩份,那麼就一直分下去
因為每次分,都會使得乘積變大,直到x==2||y==2,
【由於不能出現重複的數】,那麼分的過程中如果2,3出現過了,下乙個5就不能再分解了
也就是最終的序列會是2+3+4+5+......x,
如果最後多出某一部分y,這部分y肯定不能丟在乙個數上
例如加在x上, 那麼 得到x-1,x+y, 根據剛才的越接近越好的結論,肯定不如x-1+y/2,x+y/2的乘積大
因此還是要均勻地加在每乙個數上,也就是從最大的數開始加;
*/#include #include #include #include #include #include #include #include #include #include using namespace std;
int main()
int tmp=i-1;
int st=2+n/(tmp-1);
for (i=st;i<=tmp+n/(tmp-1)-n%(tmp-1);i++)
for (i=tmp+n/(tmp-1)-n%(tmp-1)+1;i<=tmp+n/(tmp-1);i++)
printf("\n");
return 0;
}
POJ 1032 解題報告
p.s.之前按照列表做,做著做著就做岔了。這裡回歸正軌。這道題後來做成了找規律題 我用遞迴搜尋不出意外地tle了 discuss 上面有好些關於規律的討論和證明,比如 知道後就簡單了很多了。這裡參考了的規律總結。thestoryofsnow 1032 accepted 144k 0msc 1028b...
poj 1032 整數拆分
給你乙個n問求使得 a1 a2 ak n時 a1 a2 ak最大。a1 a2.不相等。沒看懂題目意思。以下 思路 將乙個數分成2份,如何分,使得這兩個數乘積最大。答案是將這個數平分,證明是求x n x 的最大值。基於這種思路,將n分成乘積最大的不相等的多份,應使得其中每份的數相差盡量少,即差值為1的...
poj 1032 整數拆分
好吧,又抄了一篇,嘿嘿 給你乙個n問求使得 a1 a2 ak n時 a1 a2 ak最大。a1 a2.不相等。沒看懂題目意思。我也沒看懂 以下 思路 將乙個數分成2份,如何分,使得這兩個數乘積最大。答案是將這個數平分,證明是求x n x 的最大值。基於這種思路,將n分成乘積最大的不相等的多份,應使得...