hdu 3183 A Magic Lamp(给一个n位的数,从中删去m个数字,使得剩下的数字组成的数最小(顺序不能变),然后输出)
1.题目大意是,给你一个1000位的数,要你删掉m个为,求结果最小数。
思路:在n个位里面删除m个位。也就是找出n-m个位组成最小数
所以在区间 [0, m]里面找最小的数。相应的下标标号i
接着找区间 [i+1,m++]里面的最小数。对于下标为ii
接着找区间 [ii+1,m++]里面的最小数……
这样就会找n-m个数了。区间这样安排的目的是为了保证取出来的数的顺序。
2代码:
#include<cstdio>
#include<cstring>
#include<cmath>
#define Min(a,b) ((a)<(b)?(a):(b))
using namespace std; char s[10005];
int a[10005];
int an[10005];
int ST[10005][20];
int n,m; void make_ST()//记录的是最小值的下标
{
for(int j=1; (1<<j)<=n; j++)
{
for(int i=1; (i+(1<<j)-1)<=n; i++)
{
if(a[ST[i][j-1]]<=a[ST[i+(1<<(j-1))][j-1]])//得取等号,使得两个数相等的时候取下标小的
ST[i][j]=ST[i][j-1];
else
ST[i][j]=ST[i+(1<<(j-1))][j-1];
}
}
} int Query(int l,int r)
{
int k=floor(log2(r-l+1));
int ans;
if(a[ST[l][k]]<=a[ST[r-(1<<k)+1][k]])
ans=ST[l][k];
else
ans=ST[r-(1<<k)+1][k];
return ans;
} int main()
{
while(scanf("%s%d",s,&m)==2)
{
n=strlen(s);
for(int i=0; i<n; i++)
{
a[i+1]=(s[i]-'0');
ST[i+1][0]=i+1;
}
make_ST();
int t=1;
int temp=1;
for(int i=m+1; i<=n; i++) //找n-m个数,每次从[t,i]中找最小的
{
t=Query(t,i);
an[temp++]=a[t++];
}
t=1;
while(t<temp&&an[t]==0)
t++;
if(t>=temp)
printf("0\n");
else
{
for(int i=t; i<temp; i++)
printf("%d",an[i]);
printf("\n");
}
}
return 0;
}
hdu 3183 A Magic Lamp(给一个n位的数,从中删去m个数字,使得剩下的数字组成的数最小(顺序不能变),然后输出)的更多相关文章
- hdu 3183 A Magic Lamp(RMQ)
题目链接:hdu 3183 A Magic Lamp 题目大意:给定一个字符串,然后最多删除K个.使得剩下的组成的数值最小. 解题思路:问题等价与取N-M个数.每次取的时候保证后面能取的个数足够,而且 ...
- hdu 3183 A Magic Lamp RMQ ST 坐标最小值
hdu 3183 A Magic Lamp RMQ ST 坐标最小值 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3183 题目大意: 从给定的串中挑 ...
- HDU 3183 - A Magic Lamp - [RMQ][ST算法]
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3183 Problem DescriptionKiki likes traveling. One day ...
- hdu 3183 A Magic Lamp rmq或者暴力
A Magic Lamp Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Pro ...
- hdu 3183 A Magic Lamp(RMQ)
A Magic Lamp Time Limi ...
- HDU 3183 A Magic Lamp(RMQ问题, ST算法)
原题目 A Magic Lamp Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- hdu 3183 A Magic Lamp 【RMQ】
<题目链接> <转载于 >>> > 题目大意: 给出一个长度不超过1000位的数,求删去m位数字以后形成的最小的数字是多少. 解题分析: 分析:我们可以把题 ...
- HDU 3183 A Magic Lamp
直接模拟 如果后一位比前一位小,那就一直 向前 pop()掉 维护他单调递增: #include<iostream> #include<cstring> #include& ...
- HDU 3183 A Magic Lamp(二维RMQ)
第一种做法是贪心做法,只要前面的数比后面的大就把他删掉,这种做法是正确的,也比较好理解,这里就不说了,我比较想说一下ST算法,RMQ的应用 主要是返回数组的下标,RMQ要改成<=(这里是个坑点, ...
随机推荐
- luogu 1968 美元汇率
https://www.luogu.org/problemnew/show/P1968 定义二维数组f[ ][ ],f[i][1]表示在第i天将马克变为美元,f[i][2]表示在第i天将美元变为马克. ...
- python 学习总结1
计算机与程序设计 一.计算机的概念 1.计算机是根据指令操作数据的设备. 2.计算机主要包括两个功能性一个是功能性另一个是计算性 功能性是对数据的操作,表现为数据计算,输入输出处理和结果存储 可编程性 ...
- 【HIHOCODER 1052 】基因工程(贪心)
链接 问题描述 小Hi和小Ho正在进行一项基因工程实验.他们要修改一段长度为N的DNA序列,使得这段DNA上最前面的K个碱基组成的序列与最后面的K个碱基组成的序列完全一致. 例如对于序列"A ...
- linux中的vi命令
linux的重要的几个命令如下: ①,光标的操作 1,gg,G,nG,:n gg移到文档的开头一行,G移动到最后一行,nG移动到第n行,到指定的行. 2,H,M,L 光标分别移动到这个界面的最上边,中 ...
- luogu3380 【模板】二逼平衡树(树套树)
#include <iostream> #include <cstdlib> #include <cstdio> #include <ctime> us ...
- javascript:与获取鼠标位置有关的属性
javascript并没有mouse对象,获取鼠标坐标要靠强大的event对象。 我们通过监听document的mousemove,就可以实时获得鼠标位置。 但是!!event中和鼠标相关的属性太多了 ...
- ssm依赖
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/20 ...
- mybatis自动映射和手动映射
一对一查询 第一种方法: <!-- 查询所有订单信息 --> <select id="findOrdersList" resultType="cn.it ...
- [Go]条件语句
package main import ( "io/ioutil" "fmt" ) //条件语句 //if的条件语句不需要括号 //if的条件里可以赋值,if的 ...
- [HNOI2009]梦幻布丁(链表+启发式合并)
洛谷传送门 开始一个O(n^2)思路,每次每句要改变颜色的点,改变完颜色后重新计算颜色的段数,显然拉闸. 然后呢..然后就不会了. 看了别人博客,才知道有个叫做启发式合并的东西,就是把小的合并到大的上 ...