acm pku 1032 Parliament 解题报告

来源:互联网 发布:农村淘宝的利润是多少 编辑:程序博客网 时间:2024/06/08 12:38
      题目就是要找一个有不同元素的序列,使得它们的和为给出的整数N,并且
它们的积最大。其实这样的一个序列满足这样的性质:
1.4>a1>1
2.a[i+1]-a[i]<=2(假设该序列按升序排列)
3.a[i+1]-a[2]=2的情况最多有1个
由此可以轻松构造出该序列:
1.从2开始累加,直到和m大于等于n
2.j=m-n,把序列中的j划去(当j=1时,划去2并将最后一个元素加1)

具体代码如下:
  1. #include <iostream>
  2. using namespace std;
  3. int an[100];
  4. void input()
  5. {
  6.       int N;
  7.       while(cin>>N)
  8.       {
  9.              int sum = 0,i=2,j=2,k;
  10.              memset(an,0,sizeof(an));
  11.              while(sum<=N)
  12.              {
  13.                     an[i]=i;
  14.                     sum+=i;
  15.                     i++;
  16.              }
  17.             // cout<<sum<<" "<<i<<endl;
  18.              int flag = sum-N;
  19.              if(flag == 1)
  20.              {
  21.                    an[2] = 0;
  22.                    an[i-1]++;
  23.              }
  24.              else an[flag] = 0;
  25.              //cout<<flag<<endl;
  26.              //cout<<an[3]<<endl;
  27.              for(k=0;k<i;++k)
  28.              {
  29.                    if(an[k] == 0) continue;
  30.                    cout<<an[k]<<" ";
  31.              }
  32.              if(an[k]) cout<<an[k]<<endl;
  33.       }
  34. }
  35. int main()
  36. {
  37.      input();
  38.      return 0;
  39. }