1413 权势二进制
题目来源: CodeForces
基准时间限制:1 秒 空间限制:131072 KB 分值: 10 难度:2级算法题
一个十进制整数被叫做权势二进制,当他的十进制表示的时候只由0或1组成。例如0,1,101,110011都是权势二进制而2,12,900不是。
当给定一个n的时候,计算一下最少要多少个权势二进制相加才能得到n。
Input
单组测试数据。
第一行给出一个整数n (1<=n<=1,000,000)
Output
输出答案占一行。
Input示例
9
Output示例
9
在没看题解的情况下,已经连续做出来二道题了,很开心,尽管是2级题,我大部分还是要看别人思路的。
思路:本道题就是模拟,建个原数的数位数组和辅助数组,每次找出这个数各位上的非零的最小数minn,辅助数组对应原数组,原数组[i]=0,则辅助数组[i]=0,原数组[i] ! = 0,则辅助数组[i]=1 ,,然后原数组[i] - =minn*辅助数组[i],这代表加了minn次权势二进制,再去找这个数各位上的非零的最小数minn,直至原数组每一位都为0.
#include<algorithm>
#include<stdio.h>
using namespace std;
int num[1000005];//原数组
int a[1000005];//辅助数组
int main()
{
int n;
scanf("%d",&n);
int pos=0;
while(n!=0)
{//将整数n分解
num[pos++]=n%10;
n/=10;
}
int maxn=0;//n的各数位中最大的数,初始化为0
int minn=10;//n的各数位中最小的非零的数
int flag=1;//标志位
int sum=0;
while(flag)
{
for(int i=0;i<pos;i++)
{//a数组就是权势二进制
if(num[i]==0) a[i]=0;
else
{
a[i]=1;
minn=min(minn,num[i]);
maxn=max(maxn,num[i]);
}
}
flag=0;
for(int i=0;i<pos;i++)
{
num[i]-=minn*a[i];
if(num[i]!=0)
{
flag=1;
}
}
sum+=minn;//加了minn次
minn=maxn;//n的各数位中最大的数
maxn=0;//初始化
}
printf("%d\n",sum);
return 0;
}