最优分解方案

[问题描述]

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

[输入文件]
输入文件best.in中只有1个数n(其中1<=n<=1000)。
[输出文件]
输出文件best.out中也是一个数,是乘积的最大值。
[输入样例]
7
[输出样例]
12

解题思路

这个题是分解数(贪心)+高精

首先必须知道,这样分解出来的乘积是最大的:
1是没有意义的而且使总数少了1
先将这个数分解成连续自然数2,3,4,5。。。知道剩下的数字小于最后一个数字。然后将剩下的数字分配给这些连续自然数,从大到小分配,每次每个数都分配1,直到剩下0

代码

type ar=array[0..255]of longint;
var a:array[1..1000]of integer;
    ans:string;
    n,num,i,x,len:longint;
    num1:ar;
procedure cheng(x:integer);
var i:longint;
begin
  for i:=1 to len do num1[i]:=num1[i]*x;
  for i:=1 to len do
    begin
      num1[i+1]:=num1[i+1]+num1[i] div 10;
      num1[i]:=num1[i] mod 10;
    end;
  while num1[len+1]<>0 do
   begin
     inc(len);
     num1[len+1]:=num1[len+1]+num1[len] div 10;
     num1[len]:=num1[len] mod 10;
   end;
end;

begin
  readln(n);
  x:=2;
  num:=0;
  while n>x do
   begin
     inc(num);
     a[num]:=x;
     n:=n-x;
     inc(x);
   end;
  while n>0 do
    begin
      for i:=num downto 1 do
        begin
          inc(a[i]);
          dec(n);
          if n=0 then break;
        end;
    end;
  fillchar(num1,sizeof(num1),0);
  num1[1]:=1;   len:=1;
  for i:=1 to num do cheng(a[i]);
  for i:=len downto 1 do write(num1[i]);
end.


测试点1 Accepted / 0ms / 260kB
测试点2 Accepted / 0ms / 260kB
测试点3 Accepted / 0ms / 260kB
测试点4 Accepted / 0ms / 260kB
测试点5 Accepted / 0ms / 260kB
测试点6 Accepted / 0ms / 260kB
测试点7 Accepted / 0ms / 260kB
测试点8 Accepted / 0ms / 260kB
测试点9 Accepted / 0ms / 260kB
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值