Gym - 100829C - The Fox and the Owl(模擬&& 思維)

題意:

給你一個數n,求位數和比n的位數和大一的且與n最接近的的比n小的數。

思路:

見註釋


#include <bits/stdc++.h>
using namespace std;
string s,ss;
const int maxn = 1e5+10;
const int inf =0x3f3f3f3f;
int a[maxn];
bool judge(int index)
{
    if(a[index] < 2)
        return 0 ;
    ss = s;
    int cnt = 2;//一共要加2
    ss[index] -=1;//當前位置減1
    for(int i = index + 1; i < ss.size() && cnt && a[index]>=2; i++)
    {
        if(ss[i] == '8')
        {
            ss[i] += 1;
            cnt--;
        }
        else if(ss[i] <'8')
        {
            if(cnt == 2)
            {
                cnt-=2;
                ss[i]+=2;
            }
            else
            {
                cnt-=1;
                ss[i]+=1;
            }
        }
    }
    if(cnt == 0)
        return 1;
    return 0;
}
int main()
{
    ios::sync_with_stdio(0);
    while(cin>>s && s!= "END")
    {
        int index = inf;
        int flag  = 0;
        int f = -1;
        memset(a,0,sizeof a);
        if(s[0] != '-')//輸入是正數
        {
            int len = s.size();
            a[len-1] = '9' - s[len-1] ;
            if(s[len-1] < '9')
                index = len-1;
            for(int i = len- 2; i >= 0; i--)
            {
                a[i] = a[i+1];//後綴和
                if(s[i] >= '1')//當前可以減1,然後判斷往後的數可不可以加2
                {
                    if(judge(i))
                    {
                        s = ss;
                        flag = 1;
                        f = i;
                        break;
                    }
                }
                a[i] += ('9' - s[i]) ;
                if(s[i] < '9' && index == inf)
                    index = i;
            }
            if(flag == 1)
            {
                int sum = 0;
                if(s[0] == '0')//如果首位減爲0,說明,總位數減小,那麼,優先輸出9就是
                {
                    for(int i = 0; i < len; i++)
                    {
                        sum += s[i]-'0';
                    }
                    int l = len-1;
                    while(l--)
                    {
                        if(sum >= 9)
                        {
                            cout<<9;
                            sum-=9;
                        }
                        else if (sum < 9 && sum > 0)
                        {
                            cout<<sum;
                            sum = 0;
                        }
                        else
                            cout<<0;
                    }
                    cout<<endl;
                }
                else
                {
                    for(int i =  0; i <=f; i++)//先輸出前幾位沒變的
                        cout<<s[i];
                    int sum = 0;
                    int l  = len  - f -1;
                    for(int i = f+1; i < len; i++ )
                        sum+=s[i]-'0';
                    while(l--)
                    {
                        if(sum >= 9)
                        {
                            cout<<9;
                            sum-=9;
                        }
                        else if(sum >0)
                        {
                            cout<<sum ;
                            sum = 0;
                        }
                        else
                            cout<<0;
                    }
                    cout<<endl;
                }
                continue;
            }
            else//如果沒辦法通過減1加2來進行變換,那麼變爲負數,在最靠右的位置加1,如果全是9,那麼增加一位
            {
                int sum = 0;
                if(index != inf)
                {
                    s[index]  += 1;
                    flag = 1;
                }
                if(flag)
                {

                    cout<<'-';
                    cout<<s<<endl;
                    continue;
                }
                else
                {
                    cout<<-1;
                    cout<<s<<endl;
                    continue;
                }
            }
        }
        else//負數簡單點,加一即可
        {
            for(int i = s.size()- 1; i>=1; i--)
            {
                if(s[i] < '9')
                {
                    s[i]+=1;
                    flag = 1;
                    break;
                }
            }
            if(flag )
                cout<<s<<endl;
            else
            {
                cout<<-1;
                for(int i = 1; i < s.size(); i++)
                    cout<<s[i];
                cout<<endl;
            }
        }
    }
    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章