XYLX 10.13 最优分解方案

来源:互联网 发布:生鲜品配送管理优化 编辑:程序博客网 时间:2024/04/27 19:00

最优分解方案


[问题描述]

经过第一轮的游戏,不少同学将会获得圣诞特别礼物,但这时细心的数学课代表发现了一个问题:留下来的人太多而使礼物数量可能不够,为此,加试了一道数学题:将一个正整数n分解成若干个互不相等的正整数的和,使得这些数的乘积最大,当主持人报出一个n后,请你立即将这个最大值报出来,现请你帮你的好友编一个程序来解决这个问题。

输入输出


[输入文件]

输入文件best.in中只有1个数n(其中1<=n<=1000)。


[输出文件]

输出文件best.out中也是一个数,是乘积的最大值。


样例 Sample


[输入样例]

7


[输出样例]

12


分析

该题直接将数分解成从2开始连续的数字,如果不足以连续则将最后一个数字从后向前一次分给每个数一个1.知道分完;
注意要加高精。

代码如下

program best;type ar=array[0..10000] of longint;var n,sum,total,now,i,j:longint;    ans:ar;    num:array[1..10000] of longint;procedure mutiply(var ans:ar;x:longint);var i:longint;begin for i:=1 to ans[0] do  begin   ans[i]:=ans[i]*x;  end; for i:=1 to ans[0]+20 do  begin   ans[i+1]:=ans[i+1]+(ans[i] div 10);   ans[i]:=ans[i] mod 10;  end; ans[0]:=ans[0]+20; while (ans[0]>0) and (ans[ans[0]]=0) do dec(ans[0]);end;begin readln(n); now:=2; sum:=0; while n<>0 do  begin   if n>now    then     begin      inc(sum);      num[sum]:=now;      n:=n-now;      now:=now+1;     end    else     begin      inc(sum);      num[sum]:=n;      n:=0;     end;  end; while (sum>1) and (num[sum]<=num[sum-1]) do  begin   j:=sum-1;   while (j>0) and (num[sum]>0) do    begin     num[j]:=num[j]+1;     num[sum]:=num[sum]-1;     j:=j-1;     end;   if num[sum]=0 then dec(sum);  end; ans[1]:=1; ans[0]:=1; for i:=1 to sum do  begin    mutiply(ans,num[i]);  end; for i:=ans[0] downto 1 do  write(ans[i]);end.

╮(╯﹏╰)╭

         ___ `-._\ /     `~~"--.,_------>|              `~~"--.,_ _.-'/ '.____,,,,----"""~~```'

萝卜,嘿嘿

0 0
原创粉丝点击