您的位置:首页 > 其它

HDU 3183 贪心

2016-03-13 14:11 190 查看
给出一个数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");
}
}


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: