题目:

小b有一个非负整数N,她想请你找出 ≤𝑁 的最大整数x,满足x各个位数上的数字是不降的。也就是说,设x的十进制表示为 𝑎1,𝑎2,…,𝑎𝑚,则对于任意 1≤𝑖<𝑚,𝑎𝑖≤𝑎𝑖+1。

输入

输入一个非负整数N。 0≤N≤10^9

输出

输出一个整数,表示答案

输入样例

332

输出样例

299

解法:

记录出现降序的位置,然后反向处理,找到一个可以减1的位置,然后后面的部分全部置为9,注意处理前部分全部是1开头的情况。

代码:

#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;
}