题目:
小b有一个非负整数N,她想请你找出 ≤𝑁 的最大整数x,满足x各个位数上的数字是不降的。也就是说,设x的十进制表示为 𝑎1,𝑎2,…,𝑎𝑚,则对于任意 1≤𝑖<𝑚,𝑎𝑖≤𝑎𝑖+1。
输入
输入一个非负整数N。
0≤N≤10^9
输出
输出一个整数,表示答案
输入样例
输出样例
解法:
记录出现降序的位置,然后反向处理,找到一个可以减1的位置,然后后面的部分全部置为9,注意处理前部分全部是1开头的情况。
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
| #include<stdio.h> #include<algorithm> using namespace std; int num[30]; int main() { int n; scanf("%d", &n); int s = n; int len = 0; while(n){ num[len++] = n%10; n /= 10; } int p = 0; for(int i = len - 1; i > 0; i--){ if(num[i] > num[i - 1]){ p = i; break; } } if(p == 0){ printf("%d\n", s); } else{ int i = p; while(num[i] - 1 < num[i + 1] && i < len - 1) i++; if(i == len - 1){ if(num[i] == 1){ for(int j = 0; j < len - 1; j++) printf("9"); } else{ printf("%d",num[i] - 1); for(int j = 0; j < len - 1; j++) printf("9"); } } else{ for(int j = len - 1; j > p; j--) printf("%d", num[j]); printf("%d", num[p] - 1); for(int j = p - 1; j >= 0; j--) printf("9"); } } return 0; }
|