反转求最大
Digital Folding
https://ac.nowcoder.com/acm/contest/120561/G
链接:https://ac.nowcoder.com/acm/contest/120561/G
来源:牛客网
来源:牛客网
#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
void deal()
{
string l, r;
cin >> l >> r;
int l_length = l.length(), r_length = r.length();
string pd = "1";
for(int i = 1; i <= r_length -1; i++) pd += "0";
//1. 如果r == 10000....00
if(r == pd){
if(l == r) {cout << '1' << endl; return ;}
else{
for(int i = 0; i < r_length - 1; ++i)
cout << "9";
cout << endl;
return;
}
}
// 统一位数
if(l_length < r_length){
l = pd;
l[r_length - 1] = '1';
}
// 2. 其他情况
string ans = "";
int s;
for(int i = 0; i < r_length; i++){
if(l[i] != r[i]){
ans += char((int)r[i] - 1);
s = r_length - i - 1;
break;
}
else ans += r[i];
}
for(int i = 0; i < s; ++i)
ans += "9";
reverse(ans.begin(),ans.end());
reverse(r.begin(),r.end());
ans = max(ans,r);
long res = stoll(ans); // 将string转换为long类型 防止”0001145454“ 等这这种出现前导0的情况
cout << res << endl;
}
int main()
{
int T;
cin >> T;
while(T--){
deal();
}
return 0;
}
该题的两种主要特例判断:
1. 如果r = 100000...000:
a. 如果这时 l = r = 100000...00 说明只能进行这一个数字的反转 结果得到1。
b. 如果 l < r 此时 r = 10000...00 这是只要把 r - 1 得到比原来少一位的 99999..99 ,这个就是结果。
2. 其他:
如果l 的位数小于r 的位数,此时可以让l 变为1000...001 与r的位数相同(因为得到的最终结果的位数只会跟r的相同)。之后从左向右遍历l和r,找到第k个 ,使l[k] != r[k],这是将r[k] - 1并将k之后的数都置为9 。
之后将前面l 和r 相同的数跟后面变成9的数存到ans 中 之后将ans 反转与r反转,求出两者中较大的一个(因为当l[k] != r[k]时候,r[k]可能等于 9 这时候就不需要将r[k] - 1 ,只要将r反转就可以得到最大的结果)。
