• 贪心算法——将正整数变为1


    题目链接http://toutiao.com/a6320936270101528833/

    为避免链接失效,再粘贴一下题目内容:

    给你一个数n,有3种操作:

    1.这个数加1

    2.这个数减1

    3.如果这个数是2的倍数,那么这个数除以2

    问给你一个数n,问最少经过多少步,可以把这个数变成1

    链接文章作者给出的解题思路是:

    1. 如果末尾是0,那么直接除以2.

    2.如果末尾是1,并且末尾连续1的个数小于

    3,那么优先选择剪发,然后开始除法。 3.如果末尾超过连续3个1,那么先使用加法,再使用除法。

    4,我们把n转成2进制,然后从低位开始,按上面的策略操作。

    作者:头条号 / 沙茶敏碎碎念
    链接:http://toutiao.com/a6320936270101528833/
    来源:头条号(今日头条旗下创作平台)
    著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

    下面给出c++源码,借助移位操作实现解题。

    #include "stdafx.h"
    #include<iostream>
    using namespace std;
    
    int _tmain(int argc, _TCHAR* argv[])
    {
        int n;
        cout<<"请输入需要变成1的正整数:";
        cin>>n;
        int temp=n;
        int num=0;    //num表示经过的计算次数
        while(n>1)
        {
            if ((n&1)==0)  //末位为0
            {
                n=n>>1;
                num++;
            }
            else if ((n&1)==1&&((n>>1)&1==1)&&((n>>2)&1)==1)   //末尾连续三个1
            {
                n=n+1;
                n=n>>3;
                num+=4;
            }
            else
            {
                n=n-1;
                n=n>>1;
                num+=2;
            }
        }
        cout<<"数字"<<temp<<"变成1经过的最少计算次数为:"<<num<<endl;
        return 0;
    }

    实际运算结果如下:

    image

    24/2=12

    12/2=6

    6/2=3

    3-1=2

    2/2=1

    image

    13-1=12

    12/2=6

    6/2=3

    3-1=2

    2/2=1

    image

    23+1=24

    24/2=12

    12/2=6

    6/2=3

    3-1=2

    2/2=1

    题目的关键在于找到解题规律,否则很难下手写代码。

  • 相关阅读:
    厂商前缀
    文本阴影和边框阴影
    2D转换
    overflow属性
    margin属性
    CSS圆角边框
    浮动定位
    文档流定位
    position属性
    选择器二
  • 原文地址:https://www.cnblogs.com/audi-car/p/5800654.html
Copyright © 2020-2023  润新知