链接:https://ac.nowcoder.com/acm/contest/3667/I
来源:牛客网
题目描述
Y 老师从小喜欢用乐高搭建自己喜欢的模型,这不突然有一天 Y 老师想用乐高建造一个神奇的小镇。小镇由无穷所不同的建筑物组成(假设 Y 老师有魔法),但是 Y 老师是一个有着强迫症的中二青年,所以一条街道如果修建了一定数量的乐高建筑,那么下个街道一定会修其两倍数量的乐高建筑,并且现在已知第一条街道只有一所乐高建筑。由于元旦佳节的临近,Y 老师还想继续为它的乐高城市添灯结彩,假设 Y 老师现在手上有 k 个装饰品,并且 Y 老师一天必须为一条街道的所有建筑都挂上一个装饰品(如果 Y 老师不能为这条街道的所有建筑挂上装饰品的话,Y 老师是不会选择这条街道的,而且 Y 老师一天只会选择一条街道),请问这 k 个装饰品最少多少天挂完呢 ?
输入描述:
多组输入
每行一个整数 k (1<=k<=1e15)
输出描述:
最少的天数
备注:
多组输入
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; }