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;
}

 

posted on 2013-09-17 21:14  小书包_Ray  阅读(177)  评论(0编辑  收藏  举报

导航