C. One-Based Arithmetic
time limit per test
0.5 seconds
memory limit per test
256 megabytes
input
standard input
output
standard output
Prof. Vasechkin wants to represent positive integer n as a sum of addends, where each addends is an integer number containing only1s. For example, he can represent 121 as 121=111+11+–1. Help him to find the least number of digits 1 in such sum.
Input
The first line of the input contains integer n (1 ≤ n < 1015).
Output
Print expected minimal number of digits 1.
Sample test(s)
input
121
output
6
题意:一个数字可以由至少多少个1的算式组成。
思路:每次有两种可能,一种是由比它小的1去构成,还有一种是比它大的1去构成。
AC代码如下:
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
ll one[16];
ll dfs(ll n,int i)
{ int k;
k=n/one[i];
n%=one[i];
if(n==0)
return k*i;
else
return k*i+min(i+dfs(one[i]-n,i-1),dfs(n,i-1));
}
int main()
{ int i,j,k;
ll n;
one[0]=0;
for(i=1;i<=16;i++)
one[i]=one[i-1]*10+1;
scanf("%I64d",&n);
printf("%I64d\n",dfs(n,16));
}