【题目描述】 输入一个高精度的正整数n,去掉其中任意s个数字后剩下的数字按原左右次序组成一个新的正整数。编程对给定的n和s,寻找一种方案使得剩下的数字组成的新数最小。 输出新的正整数。(n不超过240位) 输入数据均不需判错。 【输入】 n s 【输出】 最后剩下的最小数。 【输入样例】 175438 4 【输出样例】 13
要考虑怎么删数是最小,这里的想法就是贪心;c++
从高位到低位看,若是高位大于低位,那么删掉高位的数:175438,1<7,无论;7>5,删掉7;15438,5>4,删5;编程
高位数越大,这个数就越大,因此咱们要从高位来看,高位和下一位比较;spa
若是是递增的数,那么就删最后一位;位数变少,数字也会比删其余的要少;例如:123456;code
#include <bits/stdc++.h> using namespace std; int main() { string a; int n,i,j,k; cin>>a>>n; int len=a.size(); for(k=0;k<n;k++) //这个循环控制删数的次数 { for(i=0;i<len-1;i++) //这个循环比较此位和下一位的大小 { if(a[i]>a[i+1]) //删数 { for(j=i;j<len-1;j++) a[j]=a[j+1]; break; //删完数后,应该跳出循环,进行下一次找数删数(break不能跳出if);n次删数; } } len--; //若是不知足条件 (都是递增的数),那么长度直接减1;适用于123456这种状况;其实无论满不知足比较的条件,长度都会减1 } i=0; while(i<=len-1&&a[i]=='0') i++;
if(i==len) cout<<"0"<<endl; else for(j=i;j<=len-1;j++) cout<<a[j]; return 0; }