删数游戏

来源:互联网 发布:淘宝店铺装修宝贝 编辑:程序博客网 时间:2024/06/11 04:31

删数游戏

   输入一个高精度的正整数n(n≤240)去掉其中任意s(s≤n)个数字后剩下的数字按原顺序组成一个新的正整数。   编程对给定的n和s,寻找一种方案使得剩下的数字组成的新数最小,并输出最小数。

Input

ns

Output

最后剩下的最小数

Sample Input

175438 4

Sample Outple

13

Analysis

应为正整数n最多有240位,所以采用字符串储存n。我们选择的贪心策略是:每一步删去/删去后能使剩下正整数最小/的数。从高位开始,若各位数字递增则删去最后一个数字,否则删除第一个递减区间的首字符,然后回到串首,以此重复s次,剩下的便是解了。删数过程如下:n=175438 //删715438    //删51438     //删4138      //删813       //解为13

Code

#include<cstdio>#include<cstring>#include<iostream>using namespace std;int main(){    string n;    int s;    cin>>n>>s;        while(s--)//数没删完进入循环        for(int i=0;i<n.length();i++)            if(n[i]>n[i+1]||i==n.length())            {                n.erase(i,1);                //删数的函数(从i开始往后删除1位)                break;            }    while(n[0]=='0' &&n[1])n.erase(0,1);//删除前导0    cout<<n;}

接下来看一看数据加强版

给出一个N位数字串,删除任意K位,使剩下的数最大。

Input

第1行:2个整数N和K(1<=K<=N<=500000)第2行:N个数字(可能为0)

Output

第1行:1个可行到的最大的数

Sample Input

10 44177252841

Sample Output

775841

Analysis

我们可以模拟一个栈按顺序将字符串入栈;每次入栈时,如果栈顶元素<入栈元素,就弹出栈顶元素,并且弹出次数递减,减到0为止;然后不要急着入栈,要加一个while继续枚举下面的元素(有可能下面的元素依然小于入栈元素);这里会有特判(在代码中解释)

Code

#include<cstdio>int tail,zhan[500005],n,k,g;int main(){    scanf("%d%d\n",&n,&k);    g=k;//由于k的只要更新,必须存。    zhan[tail]=999999999;    for(int i=1;i<=n;i++)//采用一边输入一边处理    {        char x;        scanf("%c",&x);        int y=x-'0';//转换        bool f=0;//标记是否有弹出        while(y>zhan[tail]&&k)//枚举栈顶及以下元素        {            zhan[tail]=y;//将弹出值覆盖(相当于弹出)            tail--;//往下找            f=1;//弹出标记            k--;//删除个数就要减        }        tail++;//因为tail减到栈顶下一层,所以加回栈顶        if(!f)zhan[tail]=y;//没有弹出,就入栈    }    if(n==g){printf("0\n");return 0;}//当删除个数等于位数,输出0    if(k)//像54321这种数据循环找不到,需要特判        for(int i=1;i<=n-k;i++)            printf("%d",zhan[i]);    else        for(int i=1;i<=tail;i++)            printf("%d",zhan[i]);}
原创粉丝点击