题目:将n个石头分成m堆,每堆个数依次为:a1,a2,a3.。。。。。am。满足以下条件:
1、0<=ai
2、ai不等于ai+1
3、a1+a2+。。。+am=n。
求a1,a2,。。。am中个数大于或等于k的,最多有多少堆?
输入:n,k
输出:最多的堆数
样例:
输入:5,1
输出:3
思路:贪婪算法。第一堆放k个,第二堆k+1,第三堆放k。。。。直到剩下的石头数无法满足这个规律。即k,k+1,k,k+1。。。是最多的。为了协助判断下一堆是k或者k+1,可设置一个标志位flag
#include <cstdio>
#include <iostream>
using namespace std;
int main(){
int n, k, total;
while (cin >> n >> k){
total = 0;
bool flag = true;
while ((flag && n >= k) || (!flag && n >= (k + 1)))
{
if (flag)
{
n -= k;
flag = !flag;
}
else
{
n -= (k + 1);
flag = !flag;
}
++total;
}
cout << total << endl;
}
system("pause");
return 0;
}