POJ 1032 最大乘積

2021-07-15 10:29:06 字數 1289 閱讀 2400

【問題描述】

乙個正整數一般可以分為幾個互不相同的自然數的和,如3=1+2,4=1+3,5=1+4=2+3,6=1+5=2+4,…。

現在你的任務是將指定的正整數n分解成若干個互不相同的自然數的和,且使這些自然數的乘積最大。

【輸入格式】

只乙個正整數n。

【輸出格式】

是最大的乘積。

【輸入樣例】

【輸出樣例】

30 【資料範圍】

3 ≤ n ≤ 10000

【**】

poj 1032

這是一道貪心的題,通過數論的知識我們可以知道大於4的數分解成2個較近數相乘要大於原數,而這道題要分解成不同的數,所以我們可以分解成從2開始的連續數相加,這樣乘積最大,而多餘的值(比較不一定可以剛好分解完),就讓數從大到小依次加1,這樣可以保證最大。

(這真的不是數競題嗎)。

注:要用到高精度乘低精度。

#include

#include

#include

#include

#include

using

namespace

std;

const

int maxn=15;

const

int inf=200000000;

int a[maxn],an;

int ans[1000]=;

int n;

void init()

void work(int x)//高精度乘低精度。

; int bn;

for(bn=0;x!=0;x/=10,bn++)

b[bn]=x%10;

int i,j,c[501]=,k;

k=an+bn-1;

for(i=0;ifor(j=0;j1]=c[i+j]/10+c[i+j+1];

c[i+j]=c[i+j]%10;

}while(!c[k]) k--;

an=k+1;

for(int i=0;i<=k;i++)

ans[i]=c[i];

}int main()

int k=n-(2+t)*(t-1)/2;

ans[0]=1;

an=1;

for(int i=t;i>=2;i--)

work(j);

}for(int i=an-1;i>=0;i--)

printf("%d",ans[i]);

return

0;}

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...

POJ1032 數學規律

給出乙個n,把n拆分成多個不同的數,要求他們的乘積最大,公升序輸出這樣的序列 乙個數分成兩部分,要使得乘積最大必然是兩部分越接近越好 例如9分成4 5,這必然是分成兩份的所有方法中最大的 然後我們 對於 5,我們發現 5分成2 3,會 有 2 3 5,所以5還可以分,也就是對於x分成兩份,x y z...