思路: (1)先删高位(2)先删大的数 例: 输入:175438 4 输出:13 误区: 1.思路:算最后留下几个数,那为保证最大就一定是递增 错误:因为可能删去几个数后仍无法保证全部递增 2.思路:将数串中找出其最长上升子序列,然后从高向低删除 错误:为保证最长,会使得错过高位上一些大的数,而去找相对较低位的大数 正解: 将错误分析,发现错在1.有特定的删除数量限制2.为低位而舍去了高位。 所以,我们直接从高位开始,一旦出现递减,就将前面的数删除,最后如果剩下递增,就取前面几位即可 注意:找递增一定是从高位开始第一个递增就删,所以每次都要从头搜,防类似581这种情况
cin>>n>>s; int len=n.size(); n='0'+n; for(int i=1;i<=s;i++){ for(int j=1;j<=len;j++){//每次都从头搜才能保证能搜到 if(n[j]-'0'>n[j+1]-'0'){ for(int k=j;k<=len;k++){//删除一个元素,数组要前移 n[k]=n[k+1]; } break;//一次只删一个,才能保证只删s个 } } len--; } //删除串首无用的0 int j=1,m=len; while(n[j]=='0' && m>=1){ j++; m--; } for(int i=j;i<=len;i++){ //最后输出到len而不是全部输出 //如果最后此序列为递增序列就直接把后面几个删除了 cout<<n[i]; }