uva 11384
分类: 中位数与递归
题意: 给定n表示整数序列1...n,每次操作可以同时选择一个或者多个整数,同时减去一个整数,求次数最少
输入: 整数n
输出: 最小次数
解法:
化为n/2的子问题,f(n) = f(n / 2) + 1, 起始点f(1) = 1, 解之f(n) = log(n) + 1
关键问题是,为什么这样次数就是最优的?
书上和许多其它报告多提的是多次尝试,权且如此吧
#include <iostream> #include <vector> #include <map> #include <list> #include <set> #include <deque> #include <stack> #include <queue> #include <algorithm> #include <cmath> #include <cctype> #include <cstdio> #include <iomanip> #include <cmath> #include <cstdio> #include <iostream> #include <string> #include <sstream> #include <cstring> #include <queue> using namespace std; ///宏定义 const int INF = 990000000; const int MAXN = 30; const int maxn = MAXN; ///全局变量 和 函数 int main() { ///变量定义 int n; while (scanf("%d", &n) != EOF) { printf("%d\n", int(log(double(n)) / log(double(2))) + 1); } ///结束 return 0; }