关闭

hdu 3183 A Magic Lamp (RMQ)

209人阅读 评论(0) 收藏 举报
分类:

http://acm.hdu.edu.cn/showproblem.php?pid=3183

A Magic Lamp

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
rmq 问题:题意很简单,求一行数字中除去其中m个数字,使其组成最小的一个数字
使用rmq解题,设源数字长为n,那么除去m个数字后剩下的还剩n-m个数字,组成最小的数字。
(1)因为剩下n-m个数字,那么在1到m+1位置中最小的那个数字必是结果中的第一个数字i,
(2)然后从这个数字i位置的下个位置i+1开始到m+2位置的数字中最小的那个数字必定是
结果中第二个数字,以此类推下去向后找。
(3)为了保证数字最小所以要保证高位最小还要保证数字长度够用~~
这道题虽是RMQ,但是由于不是很理解RMQ,所以就自己用循环的方法实现了0MS过

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <cstdlib>
#include <limits>
#include <queue>
#include <stack>
#include <vector>
#include <map>

using namespace std;
typedef  long long LL;

#define N 1010
#define INF 0x3f3f3f3f
#define PI acos (-1.0)
#define EPS 1e-8
#define met(a, b) memset (a, b, sizeof (a))

int main ()
{
    char str[N], s[N];
    int m;

    while (scanf ("%s %d", str, &m) != EOF)
    {
        int len = strlen (str), pos = 0;
        int k = len-m, j = 0;
        met (s, 0);

        while (k)
        {
            int minx = INF, Index = 0;

            for (int i=pos; i<=m; i++)
            {
                if (minx > str[i]-'0')
                {
                    minx = str[i]-'0';
                    Index = i;
                }
            }
            s[j++] = str[Index];
            pos = Index+1;
            k--;
            if (m < len-1) m++;
        }

        int flag = 0;
        k = 0;//记录位数,当已经达到m位的时候结束循环
        for (int i=0; i<j;)
        {
            while (s[i] == '0' && !flag)
                i++;//处理前导0的情况

            s[k++] = s[i];
            flag = 1;
            i++;
        }

        s[k] = '\0';
        if (s[0] == '\0') s[0] = '0', s[1] = '\0';//处理len==m的情况
        puts (s);
    }
    return 0;
}


2
0
查看评论

HDU 3183 A Magic Lamp (单调队列)

题目链接:HDU 3183 A Magic Lamp 题意:给定一串数字和一个n。删去n个数字,数字的位置不能变,要求剩下的数字组成的一个数最小,输出这个数。 单调队列来维护这个序列递增,弹出队列的的元素是删去的。 注意:前导0的处理 和 答案是0的处理 AC代码: #in...
  • u012377575
  • u012377575
  • 2014-09-09 17:59
  • 523

hdu 3183 A Magic Lamp(RMQ)

A Magic Lamp                                       ...
  • LYHVOYAGE
  • LYHVOYAGE
  • 2014-08-05 09:39
  • 2513

HDU_3183_A Magic Lamp(贪心)

题意:给你一个数字串,要你删除m个数字后所得的最小数字串是多少。
  • jhgkjhg_ugtdk77
  • jhgkjhg_ugtdk77
  • 2015-08-06 00:24
  • 992

[hdu 3183]A Magic Lamp [RMQ or Greedy]

A Magic Lamp Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32...
  • qq_33583069
  • qq_33583069
  • 2016-07-21 10:16
  • 479

A Magic Lamp HDU - 3183 RMQ/贪心

题意就是数字串删m个字符让剩下的最小,剩下可含前导0 贪心是删掉第一个s[i]满足s[i]>s[i+1] 用rmq的话可以这样想,剩下数字串的最高位一定是s[1]~s[m+1]中的最小,设为s[x] 次高位就是s[x+1]~s[m+2]中的最小……递推一下就好 //#include #...
  • qq_34927456
  • qq_34927456
  • 2017-09-23 23:24
  • 52

hdoj 3183 A Magic Lamp 【RMQ区间取数】

A Magic Lamp Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2525 &#...
  • chenzhenyu123456
  • chenzhenyu123456
  • 2015-11-15 21:58
  • 485

hdu 3183 A Magic Lamp(RMQ)

题目链接:hdu 3183 A Magic Lamp 题目大意:给定一个字符串,然后最多删除K个,使得剩下的组成的数值最小。 解题思路:问题等价与取N-M个数,每次取的时候保证后面能取的个数足够,并且取的数最小,查询最小的操作用RMQ优化。 #include #include #i...
  • u011328934
  • u011328934
  • 2014-10-27 21:01
  • 647

HDU 3183 A Magic Lamp(贪心 or RMQ)

HDU 3183 A Magic Lamp(贪心+RMQ) 分析: 1.       首先考虑对于n个数字组成的数,只删除1位的情况。 比如176832,删除一位使得剩下的数值最小。结果是删除7而不是删除8所以可知并不总是删除最大的那个数字...
  • u013480600
  • u013480600
  • 2014-03-21 16:34
  • 859

hdu 3183 A Magic Lamp (贪心 or RMQ)

A Magic Lamp Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 4308 ...
  • Timeclimber
  • Timeclimber
  • 2017-08-03 20:51
  • 163

Hdu 3183 A magic Lamp( RMQ问题)

RMQ问题是求区间最值问题,通常表现在给定长度的序列,回答若干次在该序列中某些区间的最值的询问,有以下几种方法 1 朴素方法,复杂度(n) 2 线段树等数据结构处理方法,进行O(logn)的预处理,每次查询复杂度O(logn) 3 ST算法,动态规划的方法进行O(nlogn)的预处理,每次查询...
  • NeQrhk
  • NeQrhk
  • 2016-07-24 17:40
  • 152
    个人资料
    • 访问:79859次
    • 积分:3561
    • 等级:
    • 排名:第10990名
    • 原创:277篇
    • 转载:6篇
    • 译文:0篇
    • 评论:17条
    最新评论