题意:给定正整数n,任务是用最小的操作次数把序列1,2,3……n中所有数边为0,每次操作可以选一到多个整数,同时减去一个正整数。
方法:例n == 6时,同时减去后边一半最小那个,也就是4,变成了1 2 3 0 1 2,然后就和操作 1 2 3 是一样的了,所以 f(6) = f(3) + 1,所以 f(n) = f(n/2)+ 1.递归就行,边界是n == 1。
#include <iostream> #include <iomanip> #include <string> #include <cstring> #include <cstdio> #include <queue> #include <stack> #include <algorithm> #include <cmath> using namespace std; int fun(int n) { return n == 1? 1 : fun(n/2) + 1; } int main() { #ifdef Local freopen("a.in", "r", stdin); freopen("a.out", "w", stdout); #endif int n = 0; while (cin >> n) cout << fun(n) << endl; }
uva - 11384 - Help is needed for Dexter
原文:http://blog.csdn.net/u013545222/article/details/19164647