序列

  • Post author:
  • Post category:其他


明明的爸爸经常用做游戏的方法启发明明对数学的兴趣。有一次,明明爸爸准备了许多盒子和球,他要和明明做一个放球的游戏。

游戏如下:要将k个小球依次装入到若干个盒子中去(可以使用的盒子数不限)。

小球装入盒子的规则如下:

1)第一个盒子不能为空。

2)依次装入各个盒子的球数必须严格递增。例如:当k=8时,装入方法有1,2,5或1,3,4。

3)装入的盒子数尽可能多。

4)所有相邻盒子的球数之差的绝对值之和最小。

如上例中:装入法1,2,5,则差的绝对值之和为(2-1)+(5-2)=4。装入法1,3,4,则差的绝对值之和为(3-1)+(4-3)=3。因此应该采用后一种装法。

明明明白了规则以后,就兴致盎然地玩起了游戏。起先明明玩得很有劲,每次都能顺利的找出最佳的装小球的方法。但是随着小球数量的增多,装小球的方法也就变得越来越多,明明就需要花更多的时间才能找到最佳的装球方法,这使得明明有些犯难了。于是明明想到了你,他想请你帮他写一个程序,他把小球的数量告诉你,而你的程序用来计算装小球的方法。

明明的问题可以归结为:告诉你小球的数量k,然后通过程序计算出盒子装小球的最佳方法。

#include<stdio.h>
#define MAX 150
int main()
{
    int n;
    int a[MAX];
    while(scanf("%d",&n)!=EOF)
    {
        for(int i=1;i<150;i++)
        {
            a[i]=i;
          //  printf("%d,",a[i]);
        }
        int sum=0;
        int j=1;
        while(sum<=n)
        {
            sum=sum+a[j];
            j++;
        }
        int temp=sum-a[j-1];
        int x=n-temp;
        for(int k=j-2;k>=(j-1-x);k--)
        {
            a[k]++;
        }
        int flag=1;
        for(int k=1;k<j-1;k++){
                if(flag==1){
                    printf("%d",a[k]);
                    flag=0;
                }
                else
                   {printf(",%d",a[k]);}
        }
        printf("\n");
    }
    return 0;
}



版权声明:本文为weixin_42498253原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。