【問題描述】
乙個正整數一般可以分為幾個互不相同的自然數的和,如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...