专栏文章

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

P13729题解参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@mioaqnix
此快照首次捕获于
2025/12/02 16:08
3 个月前
此快照最后确认于
2025/12/02 16:08
3 个月前
查看原文
题干就简单概括一下:需要寻找一个数字 bb , 使得 a+ba + b1010 进制下每一位都为奇数
但是枚举加的 bb 不是很好操作,所以我们枚举 cc ,即 c=a+bc = a + b

按位操作,分成两种情况:
  1. 当前位是偶数
  2. 当前位是奇数

对于第一种情况,我们将当前位加一,使其变为奇数。由于我们要寻找最小的 cc 使得cac \ge acc 为超级奇数,所以该位前面的数一概不变,后面的数为了保障最小,全都补成最小的奇数 11
CPP
int Nxt = Nownum + 1;
string Res = s.substr(0, i) + to_string(Nxt);
Res += string(n - i - 1, '1');
return Res;

对于第二种情况,我们先进行尝试构造一个字符串,保留当前位之前,其后的位全部填 99,来构造 。我们需要这个字符串进行辅助判断当前位是否可行。
CPP
string Tmp = s.substr(0, i + 1) + string(n - i - 1, '9');
  1. TmpTmp 要比原数 aa 大,即 TmpsTmp \ge sssaa 的字符串形式),说明这种把后面全填 99 的方式得到的数并没有比原数大(或者相等 ),不符合要求,就继续循环看下一位 。
CPP
if (Tmp >= s)
{
    continue;
}
  1. 如果 Tmp<sTmp < s ,说明当前位及之前的部分不变且后面填 99 得到的数比原数小,此时需要一些微调。此时把当前位数字加 22(因为当前位为奇数,加 22 后还为奇数,也可保障最小)。当前位之前的部分保留,当前位替换为当前数加 22 ,后面的位同样填充为 11 。
CPP
int Nxt = Nownum + 2;
string Res = s.substr(0, i) + to_string(Nxt);
Res += string(n - i - 1, '1');
return Res;

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

code

CPP
#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

评论

0 条评论,欢迎与作者交流。

正在加载评论...