贪心 删数问题

来源:互联网 发布:网络照片素材 编辑:程序博客网 时间:2024/04/30 23:30

给定n位正整数a,去掉其中任意k≤n 个数字后,剩下的数字按原次序排列组成一个新的正整数。对于给定的n位正整数a 和正整数k,设计一个算法找出剩下数字组成的新数最小的删数方案。

算法的原理应该是说从最高位开始,一次向低位搜索,一旦遇到前一位(高位)的数大于当前位,则删去前一位,直到删除k个数,如果到达末尾还没有删除k个,则说明现在这个数已经是从小到大排序了,则从最低位开始删除要求的位数。

代码1:

#include <stdio.h>#include <algorithm>#include <cmath>#include <string>#include <string.h>#include <iostream>using namespace std;int main(){    string a;    int n;    while(cin >> a >> n)    {        int m=a.size();        for(int j=0; j<n; j++)        {            int flag=0;            for(int i=0; i<m; i++)                if(a[i]>a[i+1])                {                    a.erase(a.begin()+i);                    flag=1;                    break;                }            if(!flag)               a.erase(a.end()-j,a.end());        }        cout << a<< endl;    }    return 0;}

代码2:

#include <stdio.h>#include <algorithm>#include <cmath>#include <string>#include <string.h>#include <iostream>using namespace std;int main(){    char a[105];    int n;    while(cin >> a >> n)    {        int m=strlen(a);        while(n--)        {            int i=0;            while(i<m-1&&a[i]<=a[i+1])            {                i++;            }            if(i==m-1)            {                m--;                while(n--)                   m--;                break;            }            else            {                for(int j=i;j<m-1;j++)                    a[j]=a[j+1];                m--;            }        }        for(int i=0;i<m;i++)          printf("%c",a[i]);        cout << endl;    }    return 0;}


0 0
原创粉丝点击