\(\ル1000000 \と呼ばれます)
これは、基本的な画像データは範囲が\(O(N)\)スイープ
逆掃引で、表記(S_ {I} \)\ビットの現在の数であり、\(1-S_は、{I} \)正面であります
もし\(S_I \) 10(以降の操作で発生する)キャリーの、実装\(S_I = 0、S_ { I-1} = S_ {I-1} +1 \)
場合は\(S_I <5 \) 、その後、明らかに使用します(S_I \)\張が最適です
場合(S_I>。5 \)\、次に大きいと交換(10 S_I \)\張、なぜなら\(S_I>。5 \) 、最悪の場合には、\(S_ {I-1 } <5 \) :メイクつ以上の消費が、$ 10 S_I + 1つの+ 1つのに入る前に、 \ルS_I $ それはより悪いことではない必要がありますが、よりよいがあるかもしれないので、明白なセットアップを
場合(S_I = 5 \)\、我々は分類を説明します
もし\(1-S_ {I} \ GE5 \) 、次いで、フロントケースに意志少ない利用一つ著しくより好ましくは、彼が大きいエンチャント用いるので\(= 5 10-5を\ )張さん
もし\(1-S_ {I} <5 \) 、次いで、フロントケースに意志マルチユース一つより有意に劣って、このように直接ライン5に
注判断するには、\(s_0 \)とキャリーが存在するかどうかを最終的に
// This code wrote by chtholly_micromaker(MicroMaker)
#include <bits/stdc++.h>
#define reg register
using namespace std;
const int MaxN=1000050;
template <class t> inline void read(t &s)
{
s=0;
reg int f=1;
reg char c=getchar();
while(!isdigit(c))
{
if(c=='-')
f=-1;
c=getchar();
}
while(isdigit(c))
s=(s<<3)+(s<<1)+(c^48),c=getchar();
s*=f;
return;
}
char s[MaxN];
signed main(void)
{
scanf("%s",s+1);
reg int n=strlen(s+1);
s[0]=0;
reg int ans=0;
for(int i=1;i<=n;++i)
s[i]-='0';
for(int i=n;i>=1;--i)
{
if(s[i]==10)
{
s[i]=0;
++s[i-1];
}
if(s[i]==5)
{
if(s[i-1]>=5)
{
++s[i-1];
ans+=5;
}
else
{
ans+=5;
}
}
else if(s[i]<5)
{
ans+=s[i];
}
else if(s[i]>5)
{
ans+=10-s[i];
++s[i-1];
}
}
ans+=s[0];
cout<<ans<<endl;
return 0;
}