HDU 3183 贪心

给出一个数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("
");
}
}

  

原文地址:https://www.cnblogs.com/rayrayrainrain/p/5271909.html