hdu 3183

来源:互联网 发布:方便面 知乎 编辑:程序博客网 时间:2024/05/16 11:49

思路:http://blog.csdn.net/LYHVOYAGE/article/details/38379685

题意:给出一个不超过1000位的数,求删去m个数字以后形成的最小的数是多少。

分析:我们可以把题目转化为这样一个模型:从A[1]、A[2]、……、A[n] n个数中选出n-m个数,使得组成的数最小。
一、使用RMQ,设原数字长为n,那么除去m个数字后还剩n-m个数字。
(1)因为有n-m个数字,那么在1到m+1位置中最小的那个数字必是结果中的第一个数字,记录其位置为pos
(2)然后从这个位置的下个位置pos+1开始到m+2位置的数字中最小的那个数字必定是结果中第二个数字,以此类推下去向后找。
(3)为了保证数字最小,所以要保证高位最小,还要保证数字长度满足条件


注意:数组的控制,下标从0开始,上面的1~m+1变为0~m,以下类同

  pos++位置改了几次,一开始没想好,先加的话num【0】的比较就没有了。

输出要注意先导0的末尾的0,注意判断,一开始是0就除掉了......



#include<iostream>#include<cstring>using namespace std;char num[1006],ans[1006];char min(char a,char b){    return a>b?b:a;}int main(){    int n,m;    while(cin>>num)    {        cin>>m;        n=strlen(num);        memset(ans,0,sizeof(ans));       //cout<<"num:"<<num<<" "<<"m:"<<m<<" "<<n<<endl;                char minn;        int pos=0,k=m;        for(int i=0;i<n-m;i++)        {            minn=num[pos];           // cout<<minn<<endl;           // pos++;            for(int j=pos;j<=k+i;j++)            {                if(num[j]<minn)                {                    minn=num[j];                    pos=j;                    ans[i]=minn;                }                else                    ans[i]=minn;               // cout<<minn<<endl;            }            pos++;        }        int flage=0;        for(int i=0;i<n-m;i++)        {            if(ans[i]=='0'&&flage==0)            {                continue;            }            else            {                flage=1;                cout<<ans[i];            }        }        if(flage==0)            cout<<"0";        cout<<endl;    }    return 0;}


0 0
原创粉丝点击