仅分享G题神秘解法
0~100用暴力秒
别的区间先看l和r位数一不一样
不一样的话把l调到r位数最小值-1(eg. r=188 时 把l调为99)
若调完之后刚好差1(99&100)直接输出l
若调完差2及以上,把l++
再进行判断 若调完之后刚好差1(100&101)直接输出r
其他情况,从高位到低位比较r和调完的l
若某一位差1及以上且r的后续不全为9
r的这一位-1 后续位调为9
在18:01分成功AC
我是J1N,为你分享精心制作的史
#include<bits/stdc++.h>
using namespace std;
using i64 = long long;
const i64 INF = 1e9;
int weishu(i64 n) {
int cnt = 0;
while (n) {
n /= 10;
cnt++;
}
return cnt;
}
i64 pow10(int n) {
i64 res = 1;
while (n--) {
res *= 10;
}
return res;
}
i64 numrev(i64 n) {
int tmp[17];
int cnt = 0;
while (n) {
tmp[++cnt] = n % 10;
n /= 10;
}
i64 summ = 0;
for (int i = 1; i <= cnt; i++) {
summ += tmp[i] * pow10(cnt - i);
}
return summ;
}
int main() {
int n;
cin >> n;
while (n--) {
i64 l, r;
cin >> l >> r;
i64 res = 0;
if (r <= 100) {
i64 maxx = -1e9;
for (int i = l; i <= r; i++) {
maxx = max(maxx, numrev(i));
}
res = numrev(maxx);
} else {
int len = weishu(r);
if (weishu(l) < len) {
l = pow10(weishu(r) -1) - 1;
}
// cout << l << endl;
string rstr = to_string(r);
string lstr = to_string(l);
while (rstr.size() != lstr.size())
lstr = '0' + lstr;
// cout << rstr << endl;
// cout << lstr << endl;
if (weishu(r) == weishu(l)) {
if (r == l + 1 && r % 10 == 0)
res = l;
else if (r == l + 1 && l % 10 == 0)
res = r;
else if (r - l < 10 && rstr[len - 2] == lstr[len - 2])
res = r;
else {
for (int i = 0; i < len; i++) {
if (rstr[i] == lstr[i])
continue;
else {
int all9 = 1;
for (int k = i + 1; k < len; k++) {
if (rstr[k] != '9') {
all9 = 0;
break;
}
}
if (!all9) {
rstr[i]--;
for (int k = i + 1; k < len; k++)
rstr[k] = '9';
res = stoll(rstr);
break;
} else {
res = r;
break;
}
}
}
}
} else if (r == l + 1) {
res = l;
} else {
l = pow10(weishu(r) -1);
string lstr = to_string(l);
if (r == l + 1 && r % 10 == 0)
res = l;
else if (r == l + 1 && l % 10 == 0)
res = r;
else if (r - l < 10 && rstr[len - 2] == lstr[len - 2])
res = r;
else {
for (int i = 0; i < len; i++) {
if (rstr[i] == lstr[i])
continue;
else {
int all9 = 1;
for (int k = i + 1; k < len; k++) {
if (rstr[k] != '9') {
all9 = 0;
break;
}
}
if (!all9) {
rstr[i]--;
for (int k = i + 1; k < len; k++)
rstr[k] = '9';
res = stoll(rstr);
break;
} else {
res = r;
break;
}
}
}
}
}
}
cout << numrev(res) << endl;
}
}
//1
//888 239758107329
/*for (i64 i = l; i <= r; i++) {
i64 tmp = numrev(i);
if (tmp > maxx)
maxx = tmp;
}*/

京公网安备 11010502036488号