HDU 3183 RMQ

原创 2015年11月20日 15:53:08

A Magic Lamp

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


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
 
 

#include<cstdio> #include<cstring> #include<cmath>

char s[1010]; char ans[1020]; int st[1010][20];

int Min(int x,int y) {     return s[x] <= s[y] ? x : y; }

void RMQ_Init(int len) {     for(int i = 0; i < len; i++)     st[i][0] = i;     for(int j = 1; (1<<j) < len; j++)     for(int i = 0; i+(1<<j)-1 < len;i++)     st[i][j] = Min(st[i][j-1],st[i+(1<<(j-1))][j-1]); }

int Query(int l,int r) {     int k = (int)(log((double)(r-l+1))/log(2.0));     return Min(st[l][k],st[r-(1<<k)+1][k]); }

int main() {     int len, m, i;     while(scanf("%s%d",s, &m)!=EOF)     {      //memset(ans,0,sizeof(ans));     /// memset(s,0,sizeof(s));     // memset(st,0,sizeof(st));        len=strlen(s);        RMQ_Init(len);         int n=len-m;        int pos=0;        int num=0;        while(n--)        {          pos=Query(pos,m++);          ans[num++]=s[pos++];     }     i=0;     while(ans[i]=='0'&&i<num) i++;     if(i==num)     {      printf("0");     }     else     {      for(;i<num;i++)       printf("%c",ans[i]);     }     printf("\n");     }     return 0; }

版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

HDU3183(RMQ问题,ST算法)

题目:A Magic Lamp   题意: 对于一个序列A[1...N],一共N个数,除去M个数使剩下的数组成的整数最小。 也就是说在A[1...N]中顺次选取N-M个数,使值最小。 本题很有技巧...

hdu 3183 A Magic Lamp (RMQ)

链接:http://acm.hdu.edu.cn/showproblem.php?pid=3183 题目:                                               ...

HDU3183(RMQ+鸽巢原理)

题目的意思是对于一个n位数,删除m个位后,得到的最小数是什么,比如12345 2,删除两个位,得到最小的就是123.实际上这题目解法很多,好像有贪心,线段树,RMQ等,因为我最近在学习RMQ,所以就用...

hdu3183—A Magic Lamp(RMQ,贪心)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3183 A Magic Lamp Time Limit: 2000/1000 MS (Java/Ot...

HDU 3183 A Magic Lamp(贪心 or RMQ)

HDU 3183 A Magic Lamp(贪心+RMQ) 分析: 1.       首先考虑对于n个数字组成的数,只删除1位的情况。 比如176832,删除一位使得剩下的数值最小。结果是删除7而不是...

hdu 3183(RMQ应用)

A Magic Lamp Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T...
  • fp_hzq
  • fp_hzq
  • 2011年09月16日 21:12
  • 879

hdu3183 RMQ模板 复杂度O(nlogn)

http://acm.hdu.edu.cn/showproblem.php?pid=3183 题意:对于一个序列num[1...n],一共n个数,除去m个数使剩下的数组成的整数最小。 解题思路: ...

HDU3183 A Magic Lamp(RMQ)

对于一个序列A[1...N],一共N个数,除去M个数使剩下的数组成的整数最小。 也就是说在A[1...N]中顺次选取N-M个数,使值最小。 它主要是基于以下事实: ...

hdu 3183 A Magic Lamp (贪心 or RMQ)

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

hdu3183A Magic Lamp【RMQ】

今天开始为期2天的RMQ,争取能做上6-7题,本来也不是多大的知识点。 其实第一场网络赛的之前就知道这个算法,dp的logn求静态区间最大最小值的巧妙算法,只不过这个题改成了要你算下标了。还是没有理...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:HDU 3183 RMQ
举报原因:
原因补充:

(最多只允许输入30个字)