题意:删去m个数,使剩下的数组成的数最小

题解 :贪心 , RMQ

RMQ解法,建st表找,用rmq找最小值的下标,注意点 ,因为最小值是区间最右最小值,所以应该改成 <= 而不是<

minpos[i][j] = b[minpos[i][j - ]] <= b[minpos[i + ( << (j - ))][j - ]] ? minpos[i][j - ] : minpos[i + ( << (j - ))][j - ];

且rmq查询也要同步

#include<iostream>
#include<cstdio>
#include<string>
#include<cmath>
#include<cstring>
using namespace std;
#define MAXN 20000 +9
#define MAXE 22
int h[MAXN],minpos[MAXN][MAXE];
int F_Min[MAXN][MAXE];
int N,Q;
int L,R;
// void RMQ_ST(){
// for(int i=1;i<=N;i++){
// mmax[i][0]=h[i]; // }
// int end_j=log(N+0.0)/log(2.0);
// int end_i;
// for(int j=1;j<=end_j;j++){
// end_i=N+1-(1<<j);
// for(int i=1;i<=end_i;i++){
// //mmax[i][j]=max(mmax[i][j-1],mmax[i+(1<<(j-1))][j-1]);
// mmin[i][j]=min(mmin[i][j-1],mmin[i+(1<<(j-1))][j-1]);
// }
// }
// } // int QueryMin(int L,int R){ // int k=log(R-L+1.0)/log(2.0);
// return min(mmin[L][k],mmin[R-(1<<k)+1][k]);
// } void RMQ_pos_init(int n, int b[]){
int i, j;
for (i = ; i <= n; i++) {
// maxpos[i][0] = i;
minpos[i][] = i;
}
for (j = ; ( << j) <= n; j++)
for (i = ; i + ( << j) - <= n; i++){
minpos[i][j] = b[minpos[i][j - ]] <= b[minpos[i + ( << (j - ))][j - ]] ? minpos[i][j - ] : minpos[i + ( << (j - ))][j - ];
//maxpos[i][j] = b[maxpos[i][j - 1]] > b[maxpos[i + (1 << (j - 1))][j - 1]] ? maxpos[i][j - 1] : maxpos[i + (1 << (j - 1))][j - 1];
} } int RMQ_pos_min(int s, int v, int b[]){
int k = (int)(log((v - s + )*1.0) / log(2.0));
return b[minpos[s][k]] <= b[minpos[v - ( << k) + ][k]] ? minpos[s][k] : minpos[v - ( << k) + ][k];
} char str[+ ];
int ans[ + ];
int main(int argc, char const *argv[])
{
int n;
while(~scanf("%s %d",&str,&n)){
int len = strlen(str);
int l = , r = n + ;
int m = len - n ;
int sum = ;
for(int i = ; i < len; i ++){
h[i + ] = str[i] - '';
}
// for(int i = 1;i )
RMQ_pos_init(len,h);
while(m--){
int i = l ;
int size = l ;
// for(;i <= r;i++){
// if((str[i] - '0') < (str[size] - '0')) size = i;
// }
//cout << l << " " << r << endl;
size = RMQ_pos_min(l,r,h);
//cout << size << endl;
ans[sum++] = h[size];
l = size + ;
r++;
}
int i = ;
while(ans[i] == && i < sum) i++;
if(i == sum) printf("");
else
// for(auto au : ans){
// printf("%d",ans );
// }
for(;i < sum; i++) printf("%d",ans[i]);
printf("\n"); }
return ;
}

RMQ

贪心解法

删除m个数字,相当于在里面从左往右取n-m个数字;所得数最小,也就是每次取得数字尽量小。那么,取得的第一个数字一定在区间[0,m]内,为什么呢?因为除了第一个数之外还要取n-m-1个数字,所以区间右边界最大只能是m,每次在区间里找最小的那个数(尽量靠左);依次类推,假设第一个数字取得的下标是index1,那么,第二个数字一定是在[index1+1,m+1]内取得;依次类推下去,右边界每次加1。当选取到了n-m个数字之后,也就找到了答案了~

#include<iostream>
#include<cstdio>
#include<string>
#include<cmath>
#include<cstring>
using namespace std;
#define MAXN 200000 +9
#define MAXE 22
int h[MAXN],mmax[MAXN][MAXE];
int N,Q;
int L,R;
void RMQ_ST(){
for(int i=;i<=N;i++){
mmax[i][]=h[i]; }
int end_j=log(N+0.0)/log(2.0);
int end_i;
for(int j=;j<=end_j;j++){
end_i=N+-(<<j);
for(int i=;i<=end_i;i++){
mmax[i][j]=max(mmax[i][j-],mmax[i+(<<(j-))][j-]);
// mmin[i][j]=min(mmin[i][j-1],mmin[i+(1<<(j-1))][j-1]);
}
}
}
int QueryMax(int L,int R){ int k=log(R-L+1.0)/log(2.0);
return max(mmax[L][k],mmax[R-(<<k)+][k]);
} char str[+ ];
int ans[ + ];
int main(int argc, char const *argv[])
{
int n;
while(~scanf("%s %d",&str,&n)){
int len = strlen(str);
int l = , r = n;
int m = len - n;
int sum = ;
while(m--){
int i = l;
int size = l;
for(;i <= r;i++){
if((str[i] - '') < (str[size] - '')) size = i;
}
ans[sum++] = str[size] - '';
l = size + ;
r++;
}
int i = ;
while(ans[i] == && i < sum) i++;
if(i == sum) printf("");
else
// for(auto au : ans){
// printf("%d",ans );
// }
for(;i < sum; i++) printf("%d",ans[i]);
printf("\n"); }
return ;
}

贪心

3183 RMQ / 贪心(坑成。。)的更多相关文章

  1. 【bzoj5073】[Lydsy1710月赛]小A的咒语 后缀数组+倍增RMQ+贪心+dp

    题目描述 给出 $A$ 串和 $B$ 串,从 $A$ 串中选出至多 $x$ 个互不重合的段,使得它们按照原顺序拼接后能够得到 $B$ 串.求是否可行.多组数据. $T\le 10$ ,$|A|,|B| ...

  2. hduacm 3183 rmq

    http://acm.hdu.edu.cn/showproblem.php?pid=3183 问题等价与取N-M个数,每次取的时候保证后面能取的个数足够,并且取的数最小  查询最小用rmq #incl ...

  3. HDU3183 RMQ/贪心

    A Magic Lamp Problem Description Kiki likes traveling. One day she finds a magic lamp, unfortunately ...

  4. hdu 3183 rmq+鸽巢原理

    题目大意: 给你一个数字字符串序列,给你要求删掉的数字个数m,删掉m个数使的剩下的数字字符串的之最小.并输出这个数字: 基本思路; 这题解法有很多,贪心,rmq都可以,这里选择rmq,因为很久没有写r ...

  5. hdu 3183(贪心)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3183 思路:比较前后两个相邻的字符,如果前面一个字符大于后面一个字符,就把它去掉. #include ...

  6. HDU 6034 Balala Power! (贪心+坑题)

    题意:给定一个 n 个字符串,然后问你怎么给 a-z赋值0-25,使得给定的字符串看成26进制得到的和最大,并且不能出现前导0. 析:一个很恶心的题目,细节有点多,首先是思路,给定个字符一个权值,然后 ...

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

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

  8. [APIO / CTSC2007]数据备份 --- 贪心

    [APIO / CTSC 2007]数据备份 题目描述 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份. 然而数据备份的工作是枯燥乏味的,因此你想设计一个系统让不同的办公 ...

  9. CTSC2015&APIO2015滚粗记

    CTSC 这次CTSC的考试,觉得还是考出了自己该有的水平.虽然自己最后还是没有得到金牌,但是我觉得自己尽力了,也没有什么太大的遗憾.比起省选,自己在应试的方面又有了很大的进步. Day1是我主要捞分 ...

随机推荐

  1. H5 图片上传

    1.h5 图片异步上传 (1) 异步上传input触发onchange事件的时候,就把图片上传至服务器.后台可能会返回图片的链接等信息,前台可以把图片信息展示给用户看. (2) 另一种情况可能需要前台 ...

  2. 【GDOI2014模拟】服务器

    前言 直到比赛最后几分钟,才发现60%数据居然是一个水dp,结果没打完. 题目 我们需要将一个文件复制到n个服务器上,这些服务器的编号为S1, S2, -, Sn. 首先,我们可以选择一些服务器,直接 ...

  3. 2019年开发App记录

    Pod 制作私有库参考 https://www.jianshu.com/p/f903ecf8e882 Pod私有库的升级 改代码部分,到Example文件夹执行pod install ,修改XXX.s ...

  4. 接口返回[object,Object]解决方法

    1.我们请求接口时有时会返回[object,Object],[object,Object],[object,Object].... 这个我们使用JSON.stringfity(data),就可以解决.

  5. PHP上传一个文件夹

    该项目核心就是文件分块上传.前后端要高度配合,需要双方约定好一些数据,才能完成大文件分块,我们在项目中要重点解决的以下问题. * 如何分片: * 如何合成一个文件: * 中断了从哪个分片开始. 如何分 ...

  6. POJ 2104 K-th Number ( 求取区间 K 大值 || 主席树 || 离线线段树)

    题意 : 给出一个含有 N 个数的序列,然后有 M 次问询,每次问询包含 ( L, R, K ) 要求你给出 L 到 R 这个区间的第 K 大是几 分析 : 求取区间 K 大值是个经典的问题,可以使用 ...

  7. express 和 pm2 建立博客

    前置知识 node.js 相关 服务器相关 在本地参照 express 官网的例子写成后, 上传服务器. 服务器安装 pm2 ,实用 pm2 保护进程. 注意静态文件实用的方法 app.use(exp ...

  8. 51nod1584加权约数和

    题目大意: 求: \[ \sum_{i-1}^n\sum_{j=1}^nmax(i,j)\sigma(i*j) \] 题解 对于这个\(\max\),套路的把它转化成: \[ 2*\sum_{i=1} ...

  9. border、outline、boxshadow那些事

    border 边框是我们美化网页.增强样式最常用的手段之一.例如: <div class="text"></div> .text { width: 254p ...

  10. CSS3实现图片黑白滤镜居中,hover缩放遮罩的效果

       hover: 在前端开发中经常会遇到项目展示,往往会采用卡片方式来描述.众多网站中,普遍采用CSS3的scale()方法来实现交互. 本文即是利用纯CSS实现图片居中缩放,此类方法各大网站均有应 ...