pku 1032

题意:将一个数分为互不相等也乘积最大的几个数。

算法思路来源:discuss讨论区。

思路: 我们首先先撇开“每组的人数不同”这一约束条件,我们发现如10可以拆成5+5,它的乘积最大,而5又可拆成2+3;2*3>5;故我们发现每次的每一个数都拆成两个相等或相差1的两个数乘积最大。而最大的当然是一直拆到出现2;
   我们在回来考虑“每组的人数不同”这一约束条件;每组的人数不能相等,但我们又要使数拆成最小的部分(最好拆到出现2),比如说2.3.4~~,那我们大可从2加起,2+3+4+~~~一直加到接近所要求的数;如26我们可以用个循环得到2+3+4+5+6,然后让它停下,此时还剩余6(26-2-3-4-5-6)没用完;那我们就从加数序列的最大那个数开始倒序一次加一,这样过后加数序列就变成了3+4+5+6+7了,但还有1没用啊,当然加给最大的那个7(这个过程用一个取模运算就行了);所以最后答案是3+4+5+6+8.
代码:

#include<stdio.h>
int main()
{
 long n,i;
 long a[1000],sum,cishu;
 while(scanf("%ld",&n)!=EOF)
 {
  cishu=1;
  sum=n;
  for(i=2;;i++)
  {
   
   a[cishu]=i;
   sum-=i;
   cishu++;
   if(sum<=i)
    break;
   
  }
  while(sum!=0)
  {
   for(i=cishu-1;i>0;i--)
   {
    a[i]+=1;
    sum--;
    if(sum==0)
     break;
   }
  }
  for(i=1;i<cishu-1;i++)
   printf("%ld ",a[i]);

  printf("%ld/n",a[cishu-1]);
  

 }
 return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值