• 51Nod 1413 权势二进制 (思维)


    题意 : 一个十进制整数被叫做权势二进制, 当他的十进制表示的时候只由0或1组成。例如0, 1, 101, 110011都是权势二进制而2, 12, 900不是。当给定一个n (1<=n<=1,000,000)的时候, 计算一下最少要多少个权势二进制相加才能得到n。

     

    分析 : 由于权势二进制可以在任意一位构造出1或者0, 那我就可以让每一位都在同时减1, 直到某一位变成0, 继续减其他位, 直到全部都等于0。例如 23303, 可以先构造11101进行相减, 使得除了零外的每一位都减1, 减两次后会变成 01101, 此时再减一次1101即可, 可以看出减的次数取决于这个数中最大的位数, 比如23303就是3, 8889就是9......而减的次数也就是题目所求的最少相加次数。

     

    瞎搞 : 完全没看出考查思维……然后先是进制转化构造出了1,000,000内所有的权势二进制, 最后发现二分查找+贪心无法解决, 一脸懵逼看了题解才发现居然如此巧妙。=_=

    #include<iostream>
    #include<stdio.h>
    #include<string.h>
    #include<ctype.h>
    #include<algorithm>
    using namespace std;
    
    int main(void)
    {
        char ch;
        int Max = -1;
        while( (ch=getchar()) && ch!='
    ' ){
            if( ch-'0' > Max ){
                Max = ch-'0';
            }
        }
        printf("%d
    ", Max);
        return 0;
    }
    View Code
  • 相关阅读:
    Solaris 11 system package 安装与更新(如:assembler)
    JS实现页面内跳转
    使用Eclipse进行嵌入式软件开发
    Eclipse下C++标准库报错::mbstate_t has not been declared
    嵌入式ARM开发环境搭建
    CCS内存数据转成图片
    RESET
    Android 圆角研究
    Java 重写必须满足的条件
    android 社会化分享集成
  • 原文地址:https://www.cnblogs.com/qwertiLH/p/6978432.html
Copyright © 2020-2023  润新知