给出一个数n 再给一个数m 问 在n中拿掉m个数 n最小多少
n用字符串来存 最多1000位
思想是 最后会留下n-m位 所以从后往前看 从n-m+1位往前看 取最小的一个值 让它做第一位
然后将这个值的位子标记 以后只看到标记的位子就break
这样可以保证第一位是可以选的最小的 由于第一位在让n变小的重要性大于第二位及以后 所以后面的都要迁就前面的 故遇到标记 即已经到了前一位的地方 就break出来
需要注意的是当某一位选择最小值的时候 应该尽量往前面选 即使值一样小 这样可以给后面的开辟空间
#include<stdio.h> #include<string.h> #include<algorithm> #include<map> #include<math.h> #include<queue> using namespace std; char s[1005]; int n,m; char ans[1005]; bool ok[1005]; int main(){ while(~scanf("%s",s)) { int len=strlen(s); int xiabiao=len-1; scanf("%d",&n); m=len-n; m=(xiabiao-m+1); int w=0; memset(ok,true,sizeof(ok)); for(int i=m;i<=len-1;i++) { char minn=s[i]; int where=i; for(int k=i;k>=0;k--) { if(ok[k]==false) break; if(s[k]<=minn) { minn=s[k]; where=k; } } ok[where]=false; ans[w++]=minn; } bool qiandao=true; for(int i=0;i<w;i++) { if(ans[i]!='0') qiandao=false; if(!qiandao) printf("%c",ans[i]); } if(qiandao==true) printf("0"); printf(" "); } }