0%

51nod-2499-不降的数字

题目:

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

输入

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

输出

输出一个整数,表示答案

输入样例

1
332

输出样例

1
299

解法:

记录出现降序的位置,然后反向处理,找到一个可以减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;
}