增量幻境

增量幻境

时间限制: 1 Sec  内存限制: 128 MB

题目描述

  众所周知,小葱同学擅长计算,尤其擅长计算组合数,但这个题和组合数没什么关系。 

  小葱同学最近醉心于动态规划的研究,他苦学百年,已经牢牢掌握了最长上升子序列的知识。小葱对于这种单调不减的序列非常着迷,于是他灵机一动,挥笔写下了一个数x,现在小葱同学希望找到一个小于等于x的数,使得这个数的各个数位是单调不减的。求这个数。 

输入

  一行一个数x。 

输出

  一行一个数代表答案。 

样例输入

  233996

样例输出 

  233899

提示

  对于40%的数据,x≤105
  对于60%的数据,x≤109
  对于80%的数据,x≤1018
  对于100%的数据,0≤x≤10100000

题解

      如果从左至右第i位之前的最大值为x(0<=x<=9),x第一次出现在p位,在第i位第一次小于x,则第p位改为x-1,p之后全变成9。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 using namespace std;
 5 const int N=101000;
 6 char c[N];
 7 int mx,p,n,l;
 8 int main()
 9 {
10     scanf("%s",c);
11     n=strlen(c);
12     mx=-1;
13     for(int i=0;i<n;i++)
14     {
15         int x=c[i]-'0';
16         if(x<mx)
17         {
18             c[p]-=1;
19             if(c[p]<'0')
20                 c[p-1]-=1,
21                 c[p]='9';
22             for(int j=p+1;j<n;j++)
23                 c[j]='9';
24             break;
25         }
26         if(x>mx)
27             mx=x,p=i;
28     }
29     while(c[l]=='0'&&l+1<n) l++;
30     for(int i=l;i<n;i++)
31         putchar(c[i]);
32     return 0;
33 }
View Code

猜你喜欢

转载自www.cnblogs.com/Jony-English/p/11875836.html