hduacm 3183 rmq

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

问题等价与取N-M个数,每次取的时候保证后面能取的个数足够,并且取的数最小  查询最小用rmq

 1 #include<iostream>
 2 #include<algorithm>
 3 #include<cstdio>
 4 #include<cstring>
 5
 6 using namespace std;
 7
 8
 9 const int maxn = 10000 + 5;
10
11 int N,M,d[maxn][20];
12 char s[maxn];
13
14
15 struct RMQ{
16     void init()
17     {
18         N = strlen(s);
19         for (int i = 0;i<N;i++)
20         d[i][0] = s[i];
21         for (int k = 1;(1<<k)<=N;k++)
22         {
23             for (int i = 0;i<N;i++)
24             d[i][k] = min(d[i][k-1],d[i+(1<<(k-1))][k-1]);
25
26         }
27     }
28     int query(int L,int R)
29     {
30         int k = 0;
31         while (1<<(k+1)<=R-L+1) k++;
32         return min(d[L][k],d[R-(1<<k)+1][k]);
33     }
34 };
35
36 RMQ rmq;
37
38 int main()
39 {
40     while (~scanf("%s%d",s,&M))
41     {
42         rmq.init();
43         M = N - M;
44         int mv = 0;
45         bool flag = true;
46         for (int i = M;i;i--)
47         {
48             int c = rmq.query(mv,N-i);
49             while (mv<N&&s[mv]!=c) mv++;
50             mv++;
51             if (c==‘0‘&&flag)
52             continue;
53             flag = false;
54             printf("%c",c);
55
56         }
57         if (flag)
58         printf("0");
59         printf("\n");
60     }
61     return 0;
62 }

时间: 2024-11-26 11:33:10

hduacm 3183 rmq的相关文章

HDU-3183-A Magic Lamp-RMQ+ST(模板)

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3183 RMQ (Range Minimum/Maximum Query)问题是指:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标在i,j里的最小(大)值,也就是说,RMQ问题是指求区间最值的问题. ST(实质是动态规划),O(nlogn)-O(q) online. ST算法(Sparse Table),以求最大值为例,设d[i,j]表示[i,i+2^j-1]

hdu 3183 A Magic Lamp(RMQ)

题目链接:hdu 3183 A Magic Lamp 题目大意:给定一个字符串,然后最多删除K个,使得剩下的组成的数值最小. 解题思路:问题等价与取N-M个数,每次取的时候保证后面能取的个数足够,并且取的数最小,查询最小的操作用RMQ优化. #include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn = 10005; int N, M, d[m

hdu 3183 A Magic Lamp(RMQ)

A Magic Lamp                                                                               Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Problem Description Kiki likes traveling. One day she finds a magic lamp, u

hdu 3183 A Magic Lamp rmq或者暴力

A Magic Lamp Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) 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

HDU 3183 A Magic Lamp(贪心+RMQ)

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 allowe

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

原题目 A Magic Lamp Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 3964    Accepted Submission(s): 1605 Problem Description Kiki likes traveling. One day she finds a magic lamp, unfortunately the

【HDOJ】3183 A Magic Lamp

RMQ. 1 /* 3183 */ 2 #include <cstdio> 3 #include <cstring> 4 #include <cstdlib> 5 6 #define MAXN 1005 7 8 char s[MAXN], ans[MAXN]; 9 int dp[MAXN][MAXN]; 10 int n,len,m; 11 12 int min(int x, int y) { 13 return s[x]<=s[y] ? x:y; 14 } 15

整理一下rmq

rmq(int i,int j,int a)表示查询a数组i到j区间的内容中的最大/最小值核心部分为二分区间以及st预处理算法 先说st预处理算法吧 int dp[i][j];//表示以i开始 长度为2^j的区间里面元素的最大值 那么 dp[i][0] 就表示a[i]本身了 那么dp[i][j]怎么求呢? 我们将需要求的区间二分 2^k为区间二分后的长度 k的求法如下 int k=log(double(n+1))/log(2.0);//n为数组的长度 那么 dp[i][j]=max(dp[i][

POJ 3183:Stump Removal(模拟)

http://poj.org/problem?id=3183 题意:有n个树桩,分别有一个高度h[i],要用Bomb把树桩都炸掉,如果炸的位置的两边树桩高度小于Bomb炸的树桩高度,那么小于树桩高度的两侧都是可以被炸掉的.而且有传递性.求把树桩全部炸掉要消耗的最少的Bomb数所炸的位置. 看样例: 1 2 5 4 3 3 6 6 2 炸位置3(即5)的话,那么2小于5,所以位置2被炸掉,因为1小于2,所以位置1被炸掉,因为4小于5,所以位于4被炸掉,因为3小于4,所以位置5被炸掉.因此丢一个Bo