zoukankan      html  css  js  c++  java
  • UVA.11384 Help is needed for Dexter (思维题)

    UVA.11384 Help is needed for Dexter (思维题)

    题意分析

    同样水题一道,这回思路对了。
    给出数字n,面对一个1,2,3,4……n的数字序列,你可以对他们的部分或者全部减去一个相同数字,最后使得这个序列变为全0的序列,求这样操作的次数最小值。

    一开始着手想的是两两分组,既然能两两分组,为什么不三三分组呢?既然能三三分组,为什么不能四四分组呢?不难联想到二分法,即折半分组,看如下的例子:

    n = 9
    1,2,3,4,5,6,7,8,9
    折半后
    1,2,3,4
    5,6,7,8,9
    使5到9均减5,便得到
    1,2,3,4
    0,1,2,3,4
    好了就有2个1234的序列了,再次折半,变成:
    1,2,1,2
    3,4,3,4(那个0已经省略了),然后对下面的序列全部减2,就会得到。
    1,2,1,2
    1,2,1,2
    然后再折半,把所有的2全部减1,即得到:
    1,1,1,1,1,1,1,1
    最后一步,所有的1都减去1,变成0了。

    根据上述的思路,可以看出,每一次折半,都要进行一次减法操作,那么我们不难想到这样一个算法:每次都除2,除2的同时计数器+1,知道算到1为止。

    代码总览

    #include <iostream>
    #include <cstdio>
    using namespace std;
    int f(int n)
    {
        return n == 1 ? 1 :f(n/2) +1;
    }
    int main()
    {
        int n;
        while(scanf("%d",&n)!= EOF){
            int ans = f(n);
            printf("%d
    ",ans);
        }
        return 0;
    }
  • 相关阅读:
    烤盐屋——Beta冲刺日志(2/7)
    团队作业第六次--Beta阶段随笔集合
    OneDay!——冲刺日志集合
    Beta冲刺答辩
    OneDay!——随机组队“吐槽”
    OneDay!——Beta冲刺总结
    用户使用调查报告
    Beta冲刺日志--Day 7
    Beta冲刺日志--Day 6
    Beta冲刺日志--Day 5
  • 原文地址:https://www.cnblogs.com/pengwill/p/7367125.html
Copyright © 2011-2022 走看看