A Magic Lamp

Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 989    Accepted Submission(s): 371

Problem Description
Kiki likes traveling. One day she finds a magic lamp, unfortunately the genie in the lamp is not so kind. Kiki must answer a question, and then the genie will realize one of her dreams. 
The question is: give you an integer, you are allowed to delete exactly m digits. The left digits will form a new integer. You should make it minimum.
You are not allowed to change the order of the digits. Now can you help Kiki to realize her dream?
 

Input
There are several test cases.
Each test case will contain an integer you are given (which may at most contains 1000 digits.) and the integer m (if the integer contains n digits, m will not bigger then n). The given integer will not contain leading zero.
 

Output
For each case, output the minimum result you can get in one line.
If the result contains leading zero, ignore it. 
 

Sample Input
178543 4
1000001 1
100001 2
12345 2
54321 2
 

Sample Output
13
1
0
123
321
 

Source
 

Recommend
lcy
 

贪心+RMQ

在其中取出len-m,使得取出的len-m位的数最小....这个问题是贪心问题: 设给出的数是X[1..len]..当前一共要取出N = len-m 个数字..

第一次取出的是[1..len-N+1]中取了一个最小的数字,下标为pre.然后N--..第二次就从[pre+1..len-N+1]中取出最小的那个数字..这样一直取出len-m

 

其中求区间最小值时,可用线段树或RMQ实现..

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
int dp[1111][22];
char a[1111];
int n;
int out[1111];
void RMQ_init()
{
    for(int i=1;i<=n;i++)
        dp[0]=i-1;
    for(int j=1;(1<<j)<=n;j++)
        for(int i=1;i+(1<<j)-1<=n;i++)
    {
        int m=(1<<(j-1))+i;
        if(a[dp[j-1]]>a[dp[j-1]])
            dp[j]=dp[j-1];
        else if(a[dp[j-1]]==a[dp[j-1]])
            dp[j]=min(dp[j-1],dp[j-1]);
        else if(a[dp[j-1]]<a[dp[j-1]])
            dp[j]=dp[j-1];
    }
}
int RMQ(int l,int r)
{
    int k=0;
    while((1<<(k+1))<=r-l+1)   k++;
    if(a[dp[l][k]]>a[dp[r-(1<<k)+1][k]])
        return dp[r-(1<<k)+1][k];
    else if(a[dp[l][k]]==a[dp[r-(1<<k)+1][k]])
        return min(dp[l][k],dp[r-(1<<k)+1][k]);
    else //if(a[dp[l][k]]<a[dp[r-(1<<k)+1][k]])
        return dp[l][k];
}
int main()
{
    int t;
while(scanf("%s%d",a,&t)!=EOF)
{
    memset(dp,-1,sizeof(dp));
    memset(out,-1,sizeof(out));
    n=strlen(a);
    if(n==t)  {   printf("0\n"); continue;}
    RMQ_init();
    int m=n-t;
    int cur=0;
    int pre=1;
    while(m)
    {
        out[cur]=RMQ(pre,n-m+1);
        pre=out[cur]+2;
  //      cout<<pre<<endl;
        m--;cur++;
    }
 //   cout<<cur<<endl;
    int start=0;
    for(int i=0;i<cur;i++)
    {
        if(a[out]!='0')
        {
            start=i;
            break;
        }
        if(i==cur-1&&a[out]=='0')
            start=cur-1;
    }
    for(int i=start;i<cur;i++)
        printf("%c",a[out]);
    putchar(10);
}
    return 0;
}

HDOJ 3183 A Magic Lamp的更多相关文章

  1. hdu 3183 A Magic Lamp(RMQ)

    题目链接:hdu 3183 A Magic Lamp 题目大意:给定一个字符串,然后最多删除K个.使得剩下的组成的数值最小. 解题思路:问题等价与取N-M个数.每次取的时候保证后面能取的个数足够,而且 ...

  2. hdu 3183 A Magic Lamp RMQ ST 坐标最小值

    hdu 3183 A Magic Lamp RMQ ST 坐标最小值 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3183 题目大意: 从给定的串中挑 ...

  3. HDU 3183 - A Magic Lamp - [RMQ][ST算法]

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3183 Problem DescriptionKiki likes traveling. One day ...

  4. hdu 3183 A Magic Lamp(RMQ)

    A Magic Lamp                                                                               Time Limi ...

  5. hdu 3183 A Magic Lamp rmq或者暴力

    A Magic Lamp Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Pro ...

  6. HDU 3183 A Magic Lamp(RMQ问题, ST算法)

    原题目 A Magic Lamp Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) ...

  7. 【HDOJ】3183 A Magic Lamp

    RMQ. /* 3183 */ #include <cstdio> #include <cstring> #include <cstdlib> #define MA ...

  8. HDU 3183 A Magic Lamp

    直接模拟   如果后一位比前一位小,那就一直 向前 pop()掉 维护他单调递增: #include<iostream> #include<cstring> #include& ...

  9. HDU 3183 A Magic Lamp(二维RMQ)

    第一种做法是贪心做法,只要前面的数比后面的大就把他删掉,这种做法是正确的,也比较好理解,这里就不说了,我比较想说一下ST算法,RMQ的应用 主要是返回数组的下标,RMQ要改成<=(这里是个坑点, ...

随机推荐

  1. PHP 简单实现MySQL数据搜索、添加数据功能 以设备管理为例

    测试截图: 数据库bzec ,表shebeidangan 列sb_name,sb_numandtype,sb_home,sb_usedate,sb_address,sb_updatetime,sb_r ...

  2. Oracle中Clob类型处理解析:ORA-01461:仅可以插入LONG列的LONG值赋值

    感谢原作者:破剑冰-Oracle中Clob类型处理解析 上一篇分析:ORA-01461: 仅能绑定要插入 LONG 列的 LONG 值 最近为Clob字段在插入数据时发现当字符的字节数(一个半角字符一 ...

  3. 使用Handler和Timer+Timertask实现简单的图片轮播

    布局文件就只放了一个简单的ImageView,就不展示了. 下面是Activity package com.example.administrator.handlerthreadmessagedemo ...

  4. HTML a 标签 下载 apk 文件

    代码:   <a href="http://www.abc2016.com/phone_Client/shouji.apk" class="download_inp ...

  5. 64.OV7725初始化配置

    所有的结局都是好的,不好,是因为你还有坚持到最好. OV7725摄像头的初始化配置,需要SCCB总线即IIC接口配置.先发送配置数据到OV7725中,然后通过随机读取对应地址的数据来验证数据是否写进去 ...

  6. 触摸屏校准tslib的配置文件

    ./autogen.sh#sleep 10./configure --prefix=/usr/lxl/tslib --host=arm-linux CC=arm-linux-gcc#sleep 100 ...

  7. 用cmd命令合并N个文件

    今天早上朋友发我一篇小说(42个TXT文件),让我给他合并为一个文件.我首先想到的是“Copy”命令,它可以复制文件,也可以合并文件. 例如:合并1.txt和2.txt到12.txt(其为ASCII文 ...

  8. 揭开NodeJS的神秘面纱!

    一.NodeJS是什么? Node是一个服务器端JavaScript解释器.Node.js是一套用来编写高性能网络服务器的JavaScript包. 二.Node的目标是什么? Node 公开宣称的目标 ...

  9. Keystore概念,Keytool工具使用

    几个概念 keystore是一个密码保护的文件,用来存储密钥和证书(也就是说,keystore中存储的有两类型entries):这个文件(默认的)位于你的home目录,也就是你登录到操作系统的用户名的 ...

  10. android开发 wifi开发工具类

    import java.lang.reflect.Field; import java.lang.reflect.Method; import java.util.Iterator; import j ...