• 【志银】NYOJ《题目529》flip


    题目:flip

    题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=529

    吐槽Time:

    由于此题槽点太多,所以没忍住...

    看到这题通过率出奇的高然后愉快的进来想水掉...but...
    一开始狂百度找讨论区也完全看不懂题意啊,
    还好后来通过这些零碎的线索补脑了下面的题意,
    能AC但不很确定484题目本意,希望对大家有帮助(话说这样会不会帮倒忙啊^_^).

    题目意思:

    要通过x的二进制的任意位置上的数(0变为1,或1变为0)使十进制的x变为x+1, 一次只能改变二进制的x的一位,求最少需要的次数.哈哈!

    解题思路:

    通过人工打草稿的方法加上手指和快速的心算在纸上(这算神马算法0.0)算出了1~5的结果,过程简单描述如下
    1(0001)  ->0011->0010              ->2(0010)=>变2次
    2(0010)  ->0011                        ->3(0011)=>变1
    3(0011)  ->0111->0110->0100   ->4(0100)=>变3
    4(0100)  ->0101                        ->5(0101)=>变1
    5(0101)  ->0111->0110              ->6(0110)=>变2
    哈哈,得到规律:x的二进制数从1开始从右往左数第一个0的位置是几就最少需要改变几次。
    (ps:话说这么长的原理连自己都觉得有点像说了和没说一样)
    (规律原理:最少改变次数为x的二进制加1后包括进位所改变的位置数,二进制加1的进位改变停止于x的二进制数从右往左数第一个0的位置.)
    我去,终于可以写代码了..最近漫画看多了,不知不觉吐了这么多槽,这么难得不能浪费得写到博客里去,哈哈哈哈

    //对于我这种单纯boy来说还是来段我的简单走心的暴力法吧,超时什么的咱不怂,哈哈,(提交后AC的说,嘿嘿)

    #include<iostream>
    using namespace std;
    int main() {
      int T, x, n;
      cin >> T;
      while(T--) {
        cin >> x;
        n = 0;
        int y = x%2;
         do {
          y = x%2;
          x /= 2;
          n++;
        } while(y != 0);
        cout << n << endl;
      }
    }

    开始写于:2016.9.9  ----志银

    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
  • 相关阅读:
    navigator
    历史记录跳转
    更改URL
    计数器
    窗口位置和大小
    open用法
    confirm用法
    项目中访问本地node服务跨域问题
    jenkins使用
    基于Vue的SSR
  • 原文地址:https://www.cnblogs.com/chenzhiyin/p/5856206.html
Copyright © 2020-2023  润新知