题目:
分析:
贪心策略很明确,一个数大要保证其最高位最大。
考虑限制因素:
每一位所受的限制因素(1) 所给数字 (2)其后的数字
为什么没有前面的呢?因为是尽可能的大,要保障的是我大到后面的数字也是可以取值的,
再详细:
(1) 如果你本身是递增的,那么我就取你本身。
(2)本身不是递增。最高位一定要减一吗?
不是:398 3245 345654
发现了吗?和递减开始处有关。
因此解题思路,找到从头开始的递增段,而且要保证最后的那段递增是不等于的递增。 递增段不变,递减段开始处(即递增的最后一处)减一,后面全部取999999.
nice
代码:
string st;
stringstream ss1;
int N;
ss1<<N;
ss1>>st;
//寻找转折点。
int zhe=-1;
for(int i=0;i<st.size()-1;i++)
{
if(st[i]>st[i+1])
{
if(i!=0)
{
while(1)
{
if(st[i]==st[i-1]) i--;
else break;
}
zhe=i;
}
else zhe=0;
break;
}
}
if(zhe=-1) return N;
zhe=st.size()-zhe-1;
int n=N;
n=n/pow(10,zhe)-1;
for(int i=0;i<zhe;i++)
{
n=n*10+9;
}
return n;
总结:
复习:
整数转化为字符串的方法:
字符串转化为整数:
该题目又是与递增递减转折有关啊!