专栏文章
题解:P13729 【MGVOI R1-A】超级奇数(odd)
P13729题解参与者 1已保存评论 0
文章操作
快速查看文章及其快照的属性,并进行相关操作。
- 当前评论
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mioaqnix
- 此快照首次捕获于
- 2025/12/02 16:08 3 个月前
- 此快照最后确认于
- 2025/12/02 16:08 3 个月前
题干就简单概括一下:需要寻找一个数字 , 使得 在 进制下每一位都为奇数
但是枚举加的 不是很好操作,所以我们枚举 ,即
按位操作,分成两种情况:
- 当前位是偶数
- 当前位是奇数
对于第一种情况,我们将当前位加一,使其变为奇数。由于我们要寻找最小的 使得 且 为超级奇数,所以该位前面的数一概不变,后面的数为了保障最小,全都补成最小的奇数 。
CPPint Nxt = Nownum + 1;
string Res = s.substr(0, i) + to_string(Nxt);
Res += string(n - i - 1, '1');
return Res;
对于第二种情况,我们先进行尝试构造一个字符串,保留当前位之前,其后的位全部填 ,来构造 。我们需要这个字符串进行辅助判断当前位是否可行。
CPPstring Tmp = s.substr(0, i + 1) + string(n - i - 1, '9');
- 要比原数 大,即 ( 是 的字符串形式),说明这种把后面全填 的方式得到的数并没有比原数大(或者相等 ),不符合要求,就继续循环看下一位 。
if (Tmp >= s)
{
continue;
}
- 如果 ,说明当前位及之前的部分不变且后面填 得到的数比原数小,此时需要一些微调。此时把当前位数字加 (因为当前位为奇数,加 后还为奇数,也可保障最小)。当前位之前的部分保留,当前位替换为当前数加 ,后面的位同样填充为 。
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 条评论,欢迎与作者交流。
正在加载评论...