AtCoder BC155E

問題のリンク

\(\ル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;
}

おすすめ

転載: www.cnblogs.com/chinesepikaync/p/12319303.html