题解:P13729 【MGVOI R1-A】超级奇数(odd)

· · 题解

题干就简单概括一下:需要寻找一个数字 b , 使得 a + b10 进制下每一位都为奇数

但是枚举加的 b 不是很好操作,所以我们枚举 c ,即 c = a + b

按位操作,分成两种情况:

  1. 当前位是偶数
  2. 当前位是奇数

对于第一种情况,我们将当前位加一,使其变为奇数。由于我们要寻找最小的 c 使得c \ge ac 为超级奇数,所以该位前面的数一概不变,后面的数为了保障最小,全都补成最小的奇数 1

int Nxt = Nownum + 1;
string Res = s.substr(0, i) + to_string(Nxt);
Res += string(n - i - 1, '1');
return Res;

对于第二种情况,我们先进行尝试构造一个字符串,保留当前位之前,其后的位全部填 9,来构造 。我们需要这个字符串进行辅助判断当前位是否可行。

string Tmp = s.substr(0, i + 1) + string(n - i - 1, '9');
if (Tmp >= s)
{
    continue;
}
  1. 如果 Tmp < s ,说明当前位及之前的部分不变且后面填 9 得到的数比原数小,此时需要一些微调。此时把当前位数字加 2(因为当前位为奇数,加 2 后还为奇数,也可保障最小)。当前位之前的部分保留,当前位替换为当前数加 2 ,后面的位同样填充为 1 。
int Nxt = Nownum + 2;
string Res = s.substr(0, i) + to_string(Nxt);
Res += string(n - i - 1, '1');
return Res;

好了思路部分就完成了,还是建议各位同学参考以上的核心代码,不要抄袭

code

#include "bits/stdc++.h"
#define int long long
using namespace std;
string solve(string s)
{
    int n = s.size();
    for (int i = 0; i < n; ++i)
    {
        int Nownum = s[i] - '0';
        if (Nownum % 2 == 0)
        {
            int Nxt = Nownum + 1;
            string Res = s.substr(0, i) + to_string(Nxt);
            Res += string(n - i - 1, '1');
            return Res;
        }
        else
        {
            string Tmp = s.substr(0, i + 1) + string(n - i - 1, '9');
            if (Tmp >= s)
            {
                continue;
            }
            else
            {
                int Nxt = Nownum + 2;
                string Res = s.substr(0, i) + to_string(Nxt);
                Res += string(n - i - 1, '1');
                return Res;
            }
        }
    }
    return s;
}
signed main()
{
    int T;
    cin >> T;
    while (T--)
    {
        int a;
        cin >> a;
        string s = to_string(a);
        string s_ = solve(s);
        int Targ = stoll(s_);
        cout << Targ - a << endl;
    }
    return 0;
}

以上就是本题解的全部内容了。

看我写的这么辛苦,难道不给我点个赞莫

希望审核给我通过吧 QwQ