给出一个数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("\n");
}
}
原文:http://www.cnblogs.com/rayrayrainrain/p/5271909.html