Parliament ACM PKU http://acm.pku.cn/JudgeOnline/problem?id=1032

我们首先先撇开“每组的人数不同”这一约束条件,我们发现如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.
根据上面方法的描述,我写出了如下AC代码,希望能对没有AC的人有所借鉴;
#include <iostream>
using namespace std;
int main ()
{
int n,a[100000]={0},i;
cin >>n;
for (i=0;;i++)
{
   a[i]=i+2;
   n=n-a[i];
   if (n<=i+2)
    break;
}
int num =i;
int j=n/(i+1);
int m=n%(i+1);
if (j!=0)
{
for (j;j>0;j--)
   for (int k=i;k>=0;k--)
   {
    a[k]++;
   }
}
if (m!=0)
{
   for (i;m>0;i--,m--)
   {
           a[i]++;
   }
}
for (int nn=0;nn<=num;nn++)
{
   cout<<a[nn]<<' ';
}
cout <<endl;
return 0;
}

posted on 2011-05-06 19:37  _Clarence  阅读(120)  评论(0编辑  收藏  举报

导航