题目:A Magic Lamp

题意:

对于一个序列A[1...N],一共N个数,除去M个数使剩下的数组成的整数最小。

也就是说在A[1...N]中顺次选取N-M个数,使值最小。

本题很有技巧性,一开始我总是想不明白,后来在纸上画了一下,大概明白了是怎么回事。

它主要是基于以下事实:

对于序列A[1...N],选取N-M个数,使组成的值最小,而且顺序不能交换,既然要选取N-M个,那么可以容易知道这N-M位数的第一位一定在数组A中的区间

[1,M+1]中出现,为什么是这样呢?

我们可以这样来模拟一下:假设A数组就只有6个数,分别是A[1],A[2],A[3],A[4],A[5],A[6],我们去掉M=2个数,使形成的值最小。

那么我们此时的N=6,M=2,N-M=4

则我们说形成的4位数的第一位一定在区间[1,3]中出现,因为如果区间范围再大点,比如[1,4],这样就不科学了,因为第一位一定不会是A[4],更不会是

A[5],A[6],我们假设可以是A[4],那么后面只有A[5],A[6]两位数了,这样的话最多只可能形成3位数,绝对不能形成N-M=4位了。

当然到了这里,我们就可以这样做了,第一位可以在区间[1,M+1]里面找,假设第一位在位置x,因为第二位肯定在第一位的后面,所以第二位一定存在于

区间[x+1,M+2],为什么是M+2,因为第一位已经确定了,现在只需要确定N-M-1位了,所以区间就可以向后增加1,一直这样循环下去,就可以找到了。

#include <stdio.h>
#include <string.h>
#include <math.h>
#define N 1005
int m,n;
char a[N];
char num[N];
int f[N][N];
int min(int i,int j)
{
return a[i]<=a[j] ? i:j;
}
void ST()
{
int i,j;
for(i=0;i<n;i++)
f[i][0]=i;
for(j=1;j<=(int)(log((double)n)/log(2.0));j++)
{
for(i=0;i+(1<<j)-1<n;i++)
f[i][j]=min(f[i][j-1],f[i+(1<<(j-1))][j-1]);
}
}
int query(int L,int R)
{
int x=(int)(log(double(R-L+1))/log(2.0));
return min(f[L][x],f[R-(1<<x)+1][x]);
}
int main()
{
int i,j,L,R;
while(~scanf("%s%d",a,&m))
{
int len=strlen(a);
n=len;
m=len-m;
ST();
i=j=0;
while(m--)
{
i=query(i,len-m-1);
num[j++]=a[i++];
}
for(i=0;i<j;i++)
{
if(num[i]!='0')
break;
}
if(i==j)
{
puts("0");
continue;
}
while(i<j)
{
printf("%c",num[i]);
i++;
}
puts("");
}
return 0;
}

HDU3183(RMQ问题,ST算法)相关推荐

  1. RMQ的ST算法(区间最值)

    ST算法求解RMQ问题(区间最值) 效率:O(n log n)预处理,O(1)询问 思想: 用 f [ i ][ j ] 表示 以i 开头的区间,包括2^j 个元素的一段区间的最值 那么有初始化的初始 ...

  2. 动态规划-RMQ问题(ST算法)

    文章目录 RMQ问题 ST算法 模板 例题 P2251 质量检测 P1816 忠诚 P2216 [HAOI2007]理想的正方形 RMQ问题 RMQ(Range Minimum/Maximum Que ...

  3. RMQ问题(线段树算法,ST算法优化)

    RMQ (Range Minimum/Maximum Query)问题是指: 对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标在[i,j]里的最小(大)值 ...

  4. RMQ ST算法简介

    RMQ (Range Minimum/Maximum Query)问题是指:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标在i,j里的最小(大)值,也就 ...

  5. RMQ问题,加深对ST算法的理解(Sparse Table)

    Sparse Table(稀疏表):简称ST 简介 ST 算法本质是动态规划. 时间复杂度为: 预处理:O(nlogn) 查询:O(1) 它 适宜用于 数据不再作出变化(也称离线) 的 区间最值 查询 ...

  6. ST算法解决RMQ问题

    关于ST算法,实际上它本身并不难,它的思想是动态规划.主要用来求RMQ问题,时间复杂度为O(NlgN+M)  关于RMQ问题描述: 输入N个数和M次询问,每次询问一个区间[L,R],求第L个数到R个数 ...

  7. 【原创】RMQ - ST算法详解

    ST算法: ID数组下标: 1   2   3   4   5   6   7   8   9     ID数组元素: 5   7   3   1   4   8   2   9   8 1.ST算法 ...

  8. ST算法 - RMQ(区间最值问题)—— 倍增

    文章目录 引入倍增: 例题1:区间和 例题2:Genius ACM 应用: ST算法 求解 RMQ(区间最值问题) 模板Code: 练习题: ST算法 维护区间最大公约数 例题:Pair of Num ...

  9. 1470: 区间求最值(RMQ问题,ST算法模板)

    1470: 区间求最值 Time Limit: 1 Sec Memory Limit: 128 MB [Submit][Status][Web Board] Description 给定一个长度为N ...

  10. RMQ+1/-1算法

    RMQ+1/-1问题要求数列中相邻两个元素相差+1或-1.利用这个限定条件可以使该算法复杂度总体上达到<O(n),O(1)>.具体做法是: 1) 设数列A的大小为n,先对数列A分组,每组大 ...

最新文章

  1. HTTP协议是无状态协议,怎么理解?
  2. Linux的判断命令
  3. 写一个android图表框架1
  4. python app服务器_Python应用02 Python服务器进化
  5. 歌谣带你看java面试题
  6. 日志 中文乱码、nacos 中文乱码、saltstack 中文乱码、docker中文乱码
  7. 计算机基础word-常见问题
  8. 【李宏毅机器学习】Why Deep Learning(p15) 学习笔记
  9. python中ttk详解_Python 中的Property 动态属性和特性详解
  10. Asp.net MVC - 使用PRG模式(附源码)
  11. 【渝粤教育】国家开放大学2019年春季 2321物流学概论 参考试题
  12. mysql1.0.17.0安装教程_mysql 8.0.17 安装配置图文教程
  13. 19-离线词典生成原理、图像描述子用BoW转化为BoW向量和FeatureVe
  14. Word宏的利用学习
  15. Java 存牌洗牌发牌看牌
  16. 爱奇艺又涨价?注定想追剧就要成为SSSSVIP
  17. CFD(计算流体动力学)在直升机中的应用
  18. 电机控制Clarke(α/β)等幅值变换推导
  19. 根据工作日历推算工作日的算法
  20. Android显示九宫图(自定义圆角,仿微信九宫格图)

热门文章

  1. Lambda表达式有参数有返回值的练习(自定义接口)
  2. SpringBoot-高级-检索-整合SpringDataElasticsearch
  3. 算法和时间复杂度概念(一级)
  4. SpringBoot 配置错误页
  5. mysql5.58_mysql5.58编译安装手记
  6. 创建用户赋权限_MySQL实战第84篇:MySQL数据库添加用户和赋权限,在8.0版本!
  7. 200915阶段一C++模板
  8. sq语句报错Parameter index out of range (2 > number of parameters, which is 1).
  9. STM32单片机硬件I2C驱动程序(软件轮询方式)---摘自:FeoTech
  10. Android 设计模式 - 装饰者模式