RMQ(鸽巢原理或字符串操作)
http://acm.hdu.edu.cn/showproblem.php?pid=3183
A Magic Lamp
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 8310 Accepted Submission(s): 3296
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?
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.
If the result contains leading zero, ignore it.
1000001 1
100001 2
12345 2
54321 2
1
0
123
321
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <iostream>
#include <algorithm>
#include <iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include <stdio.h>
#include <string.h>
#include <vector>
#define ME(x , y) memset(x , y , sizeof(x))
#define SF(n) scanf("%d" , &n)
#define rep(i , n) for(int i = 0 ; i < n ; i ++)
#define INF 0x3f3f3f3f
using namespace std;
] ;
];
];
int main()
{
int n , m ;
while(~scanf("%s%d" , s , &m))
{
n = strlen(s);
memset(a , , sizeof(a));
; i < n ; i++)
a[i] = s[i] - ';
; i < m ; i++)//找到m个要删除的数
{
; j < n ; j++)
{
// if(a[j] > 0)//排除标记的
// {
int k ;
; k < n ; k++)
{
)//排除标记的
break ;
}
if(a[j] > a[k])//找第一个开始递减的数
{
a[j] = - ;
break ;
}
// }
}
}
, len = ;
; i < n ; i++)
{
)//去前置零
continue ;
)
continue ;
b[len++] = a[i];
)
flag = ;
}
; i < len ; i++)
printf("%d" , b[i]);
)
printf(");
printf("\n");
}
;
}
RMQ:
因为要找n-m个数,删除m个数。所以原数的第1位到m+1位的数字中最小的那位(假设是第i位)肯定是n-m位数的第一位。(想想为什么)
这样我们就找到了第一位a[i],接下来我们在从第i+1位数到m+2位数中找最小的那位,这个肯定是n-m位数的第二位。
以此类推,找够n-m位即可。
RMQ函数要做点修改。dmin[i][j]=k表示的是区间[i,i+(1<<j)-1]内最小值的下标而不是值了。
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <iostream>
#include <algorithm>
#include <iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include <stdio.h>
#include <string.h>
#include <vector>
#define ME(x , y) memset(x , y , sizeof(x))
#define SF(n) scanf("%d" , &n)
#define rep(i , n) for(int i = 0 ; i < n ; i ++)
#define INF 0x3f3f3f3f
using namespace std;
] ;
];
] , dp[][];
int m , n ;
int Min(int x , int y)
{
return s[x] <= s[y] ? x : y ;
}
void RMQ()
{
memset(dp , , sizeof(dp));
; i < n ; i++)
dp[i][] = i ;
; j < ; j++)
{
; i < n ; i++)
{
<< j) - < n)
{
dp[i][j] = Min(dp[i][j-] , dp[i+(<<j-)][j-]);
}
}
}
}
int query(int l , int r)
{
);
<<k)+][k]);
}
vector<int>v;
int main()
{
while(~scanf("%s%d" , s , &m))
{
v.clear();
n = strlen(s);
RMQ();
m = n - m ;
;
while(m--)
{
// 在 n - m 区间至少留一个数
pos = query(pos , n - m - );//求的是最小值的下标
v.push_back(pos);
pos += ;
}
;
; i < v.size() ; i++)
{
if(flag)
{
flag = ;
cout << s[v[i]];
}
')
{
flag = ;
cout << s[v[i]] ;
}
}
if(!flag)
cout << ;
cout <<endl ;
}
;
}
RMQ(鸽巢原理或字符串操作)的更多相关文章
- hdu 3183 rmq+鸽巢原理
题目大意: 给你一个数字字符串序列,给你要求删掉的数字个数m,删掉m个数使的剩下的数字字符串的之最小.并输出这个数字: 基本思路; 这题解法有很多,贪心,rmq都可以,这里选择rmq,因为很久没有写r ...
- [BZOJ4722]由乃[鸽巢原理+bitset+倍增]
题意 给定长为 \(n\) 序列 \(a\) ,要求支持两种操作: \(1.\) 询问在一个区间 \([l,r]\) 中,是否能够选出两个交集为空的集合 $ \rm X ,Y$, 使得 \(\sum_ ...
- POJ2356 Find a multiple 抽屉原理(鸽巢原理)
题意:给你N个数,从中取出任意个数的数 使得他们的和 是 N的倍数: 在鸽巢原理的介绍里面,有例题介绍:设a1,a2,a3,……am是正整数的序列,试证明至少存在正数k和l,1<=k<=l ...
- 51nod 1574 排列转换(贪心+鸽巢原理)
题意:有两个长度为n的排列p和s.要求通过交换使得p变成s.交换 pi 和 pj 的代价是|i-j|.要求使用最少的代价让p变成s. 考虑两个数字pi和pj,假如交换他们能使得pi到目标的距离减少,p ...
- Two progressions(CodeForces-125D)【鸽巢原理】
题意:将一列数划分为两个等差数列. 思路:首先,我要吹爆鸽巢原理!!!真的很强大的东西!!! 加入能完成题设操作,则前三个数中,必有至少两个数在同一序列,枚举三种情况(a1 a2,a2 a3,a1 a ...
- POJ 3370. Halloween treats 抽屉原理 / 鸽巢原理
Halloween treats Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 7644 Accepted: 2798 ...
- POJ 2356. Find a multiple 抽屉原理 / 鸽巢原理
Find a multiple Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 7192 Accepted: 3138 ...
- cf319.B. Modulo Sum(dp && 鸽巢原理 && 同余模)
B. Modulo Sum time limit per test 2 seconds memory limit per test 256 megabytes input standard input ...
- poj 2356 Find a multiple(鸽巢原理)
Description The input contains N natural (i.e. positive integer) numbers ( N <= ). Each of that n ...
随机推荐
- hibernate.hbm.xml配置文件解析
转自:https://www.cnblogs.com/uoar/p/6670612.html 1. <!DOCTYPE hibernate-mapping PUBLIC "-//Hib ...
- ulimit 管理系统资源
具体的 options 含义以及简单示例可以参考以下表格. 选项 含义 例子 -H 设置硬资源限制,一旦设置不能增加. ulimit – Hs 64:限制硬资源,线程栈大小为 64K. -S 设置软资 ...
- Ansible笔记(2)---常用模块之文件操作
一.copy模块 1.1作用: copy模块是将ansible主机上的文件拷贝到远程受控主机 1.2常用参数: src参数 :用于指定需要copy的文件或目录. dest参数 :用于指定文件将被拷贝到 ...
- web编程jsp小tips
jsp文件头 <%@ page language="java" contentType="text/html; charset=UTF-8" pageEn ...
- ORM多表操作上
一.创建模型 例:我们来假定下面这些概念,字段和关系 作者模型:一个作者有姓名和年龄. 作者详细模型:把作者的详情放到详情表,包含生日,手机号,家庭住址等信息.作者详情模型和作者模型之间是一对一(on ...
- man mkfs
---恢复内容开始--- MKFS(8) MKFS(8) NAME/名称 ...
- AWD
扫描对方IP:ifconfig (先获取自己的IP)netdiscover -r 192.168.0.1/24 (扫描1~124的IP) 获取IP后:nmap -sV 192.168.0.104 ...
- github配置和使用
通过手册指导生产ssh key或取已有的ssh key root@iZwz93telmwbh624e5zetqZ:~# ls -al ~/.ssh total drwx------ root root ...
- Delphi 清理程序内存
procedure ClearMemory;begin if Win32Platform = VER_PLATFORM_WIN32_NT then begin ...
- SQL中MINUS的用法与UNION的用法
一:MINUS指令 其是运用在两个 SQL 语句上.它先找出第一个 SQL 语句所产生的结果,然后看这些结果有没有在第二个 SQL语句的结果中.如果有的话,那第一个SQL结果数据就被去除,而不会在最后 ...