Problem Statement
We will call a non-negative integer increasing if, for any two adjacent digits in its decimal representation, the digit to the right is greater than or equal to the digit to the left. For example, 1558, 11, 3 and 0 are all increasing; 10 and 20170312 are not.
Snuke has an integer N. Find the minimum number of increasing integers that can represent N as their sum.
Constraints
- 1≤N≤10500000
Input
The input is given from Standard Input in the following format:
N
Output
Print the minimum number of increasing integers that can represent N as their sum.
Sample Input 1
80
Sample Output 1
2
One possible representation is 80=77+3.
Sample Input 2
123456789
Sample Output 2
1
123456789 in itself is increasing, and thus it can be represented as the sum of one increasing integer.
Sample Input 3
20170312
Sample Output 3
4
Sample Input 4
7204647845201772120166980358816078279571541735614841625060678056933503
Sample Output 4
31
#include <bits/stdc++.h>
using namespace std;
const int MAXN = 500050;
char s[MAXN];
int ans, l, r, n, a[MAXN];
inline bool chk(int x)
{
int len = n, sum = 0;
for( int i = 1 ; i <= n ; i++ ) a[ i ] = ( s[ i ] - '0' ) * 9;
a[ 1 ] += 9 * x;
for( int i = 1 ; i <= len ; i++ )
if( a[ i ] > 9 )
{
if( i == len ) a[ ++len ] = 0;
a[ i + 1 ] += a[ i ] / 10;
a[ i ] %= 10;
}
for( int i = 1 ; i <= len ; i++ ) sum += a[ i ];
return sum <= 9 * x;
}
int main()
{
#ifdef wxh010910
freopen( "data.in", "r", stdin );
#endif
scanf( "%s", s + 1 );
l = 1, r = n = strlen( s + 1 );
reverse( s + 1, s + n + 1 );
while( l <= r )
{
int mid = l + r >> 1;
if( chk( mid ) ) ans = mid, r = mid - 1;
else l = mid + 1;
}
cout << ans << endl;
}