1. 程式人生 > >51Nod 1413 權勢二進制 (思維)

51Nod 1413 權勢二進制 (思維)

ios display lose main ... 發現 clas 分享 一次

題意 : 一個十進制整數被叫做權勢二進制, 當他的十進制表示的時候只由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!=
\n ){ if( ch-0 > Max ){ Max = ch-0; } } printf("%d\n", Max); return 0; }
View Code

51Nod 1413 權勢二進制 (思維)