牛客-Y 老师的乐高小镇

链接:https://ac.nowcoder.com/acm/contest/3667/I
来源:牛客网

题目描述

Y 老师从小喜欢用乐高搭建自己喜欢的模型,这不突然有一天 Y 老师想用乐高建造一个神奇的小镇。小镇由无穷所不同的建筑物组成(假设 Y 老师有魔法),但是 Y 老师是一个有着强迫症的中二青年,所以一条街道如果修建了一定数量的乐高建筑,那么下个街道一定会修其两倍数量的乐高建筑,并且现在已知第一条街道只有一所乐高建筑。由于元旦佳节的临近,Y 老师还想继续为它的乐高城市添灯结彩,假设 Y 老师现在手上有 k 个装饰品,并且  Y 老师一天必须为一条街道的所有建筑都挂上一个装饰品(如果 Y 老师不能为这条街道的所有建筑挂上装饰品的话,Y 老师是不会选择这条街道的,而且 Y 老师一天只会选择一条街道),请问这 k 个装饰品最少多少天挂完呢 ?

输入描述:

多组输入
每行一个整数 k (1<=k<=1e15)

输出描述:

最少的天数
示例1

输入

复制
3

输出

复制
2

说明

Y 老师两天分别选择第一条街和第二条街

备注:

多组输入

AC代码一:
#pragma GCC optimize(2)
#include<bits/stdc++.h>
using namespace std;
inline int read() {int x=0,f=1;char c=getchar();while(c!='-'&&(c<'0'||c>'9'))c=getchar();if(c=='-')f=-1,c=getchar();while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();return f*x;}
typedef long long ll;
const int maxn = 1e5+10;
int main()
{
    ll k;
    while(~scanf("%lld",&k)){
        int count=0;
        while(k){
            if(k%2==1){
                count++;
            }
            k/=2;
        }
        printf("%d
",count);
    }
    return 0;
}

AC代码2:先打表

#pragma GCC optimize(2)
#include<bits/stdc++.h>
using namespace std;
inline int read() {int x=0,f=1;char c=getchar();while(c!='-'&&(c<'0'||c>'9'))c=getchar();if(c=='-')f=-1,c=getchar();while(c>='0'&&c<='9')x=x*10+c-'0',c=getchar();return f*x;}
typedef long long ll;
const int maxn = 1e7+10;
ll sum[maxn];
ll k;
int main()
{
    for(int i=0;i<=64;i++){
        sum[i]=pow(2,i);    
    } 
    while(scanf("%d",&k)!=EOF){
        int ans=0;
        for(int i=0;i<=64;i++){
            if(k<=sum[i]){
                ans=i;
                break;
            }
        }
        ll count=0;
        for(int i=ans;i>=0;i--){
            if(k>=sum[i]){
                k-=sum[i];
                count++;
            }
        }
        printf("%d
",count);
    } 
    return 0;
}



原文地址:https://www.cnblogs.com/lipu123/p/12153340.html