問題描述 :
明明的爸爸經常用做遊戲的方法啓發明明對數學的興趣。有一次,明明爸爸準備了許多盒子和球,他要和明明做一個放球的遊戲。
遊戲如下:要將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,然後通過程序計算出盒子裝小球的最佳方法。
輸入說明 :
你寫的程序要求從標準輸入設備中讀入測試數據作爲你所寫程序的輸入數據。標準輸入設備中有多組測試數據,每組測試數據僅佔一行,每行有一個整數k(1 ≤k ≤10000),即小球的個數。每組測試數據與其後一組測試數據之間沒有任何空行,第一組測試數據前面以及最後一組測試數據後面也都沒有任何空行。
輸出說明 :
對於每一組測試數據,你寫的程序要求計算出一組相應的運算結果,並將每組運算結果作爲你所寫程序的輸出數據依次寫入到標準輸出設備中。每組運算結果爲一串整數,即表示依次放入各個盒子裏的小球的個數,每兩個數字之間用一個‘,’分隔。每組運算結果單獨佔一行,其行首和行尾都沒有任何空格或其他任何字符,每組運算結果與其後一組運算結果之間沒有任何空行或其他任何字符,第一組運算結果前面以及最後一組運算結果後面也都沒有任何空行或其他任何字符。 注:通常,顯示屏爲標準輸出設備。
輸入範例 :
1
8
10
輸出範例 :
1
1,3,4
1,2,3,4
c源碼:
#include<stdio.h>
int fun(int n)
{
int s,i;
s=0;
for(i=0;i<=n;i++)
s=s+i;
return s;
}
int main()
{
int i,j,a[1000]={0},n,t,k,s,b[150]={0};
t=0;
n=0;
while(n<=10000)
{
n=fun(t+1);
a[t]=n;
t++;
}
while(scanf("%d",&k)!=EOF)
{
memset(b,0,150);
i=0;
while(a[i]<=k)
i++;
s=i;//盒子數
for(j=0;j<s;j++)
{
b[j]=j+1;
k=k-b[j];
}
for(i=s-1;i>=0;i--)
{ if(k>0)
{
b[i]=b[i]+1;
k--;
}
else
break;
}
for(i=0;i<s-1;i++)
printf("%d,",b[i]);
printf("%d\n",b[s-1]);
}
return 0;
}