UVa 11491 Erasing and Winning (贪心,单调队列或暴力)
题意:给一个数字(开头非0),拿掉其中的d个数字,使剩下的数字最大(前后顺序不能变)。
析:拿掉d个数字,还剩下n-d个数字。相当于从n个数字中按先后顺序选出n-d个数字使组成的数字最大,当然采用窗口滑动优先选取大的。
也就是说,当然第一位最大,这个数就最大了,所以这是一个贪心算法。我开始并不知道有这个算法,
所以开始我是暴力的,700ms,要是数据量再大一点,就TLE了。所以我想肯定有高效率的算法,查了查,原来还有这个。
先说我想法,首先在前d个数字中选最大的,然后在从这个数字到d+1个中选最大的,依次往后,贪心。
想法很简单,就是太慢了。然后我再说单调队列,就是用一个队列,里面是从大到小排的,必须是这样的,先对前d-1个进行预处理,
把太小的都删了,然后一个一个的放,放的时候把小于该值的都删了,保证是从大到小的,每次从队首取元素,保证是最大的。
如果还觉得太慢了,可以在删除元素时用二分查找,更快的确定位置。
代码如下:
暴力代码:
#include <iostream>
#include <cstdio>
#include <cstring> using namespace std;
const int maxn = 100000 + 10;
int a[maxn];
char s[maxn]; int main(){
// freopen("in.txt", "r", stdin);
int n, d;
while(scanf("%d %d", &n, &d) == 2 && n){
scanf("%s", s);
for(int i = 0; i < n; ++i) a[i] = s[i] - '0'; int indx = 0;
int st = 0, ed = d+1;
while(true){
int m = -1;
for(int i = st; i < ed; ++i){
if(a[i] > m){ m = a[i]; st = i + 1; }
if(9 == m) break;
}
printf("%d", m);
if(ed == n) break;
++ed;
} printf("\n");
}
return 0;
}
单调队列代码:
#include <iostream>
#include <cstdio>
#include <cstring> using namespace std;
const int maxn = 100000 + 10;
struct node{
int id, val;
};
char s[maxn];
node a[maxn], q[maxn]; void solve(int k, int n){
int front = 0, rear = -1;
for(int i = 0; i < k; ++i){
while(front <= rear && q[rear].val < a[i].val) --rear;//预处理前d个,要保证是单调的,小于的都删掉
q[++rear] = a[i];
} int id = -1;
for(int i = k; i < n; ++i){
while(front <= rear && q[rear].val < a[i].val) --rear;//同上
q[++rear] = a[i]; while(q[front].id <= id) ++front;//因为是有顺序的,要往后放
printf("%d", q[front].val);
id = q[front].id;
}
printf("\n");
} int main(){
// freopen("in.txt", "r", stdin);
int n, d;
while(scanf("%d %d", &n, &d) == 2 && n){
scanf("%s", s);
for(int i = 0; i < n; ++i){
a[i].id = i;
a[i].val = s[i] - '0';
} solve(d, n);
}
return 0;
}
UVa 11491 Erasing and Winning (贪心,单调队列或暴力)的更多相关文章
- uva 11491:Erasing and Winning(贪心)
题意:给一个长n(n<10^5)位的数,删除d位,求删除后最大的数.(原数无前导0) 思路:从前往后扫,如果a[i] > a[i-1],则删除a[i-1].我暴力的用链表实现了…… #in ...
- 【思路、优化】UVa 11491 - Erasing and Winning
Juliano is a fan of the TV show Erasing and Winning, where participants are selected in a draw and r ...
- UVA 11491 Erasing and Winning 奖品的价值 (贪心)
题意:给你一个n位整数,让你删掉d个数字,剩下的数字要尽量大. 题解:因为最后数字位数是确定的,而且低位数字对答案的贡献是一定不及高位数字的,所以优先选择选最大且最靠左边的数字,但是有一个限制,选完这 ...
- UVA - 11491 Erasing and Winning(奖品的价值)(贪心)
题意:有一个n位整数(不以0开头),要求删除其中的d个数字,使结果尽量大.(1<=d<n<=10^5) 分析: 1.从头扫一遍,如果当前填的数字小于n-d,则将当前数字填上. 2.如 ...
- UVA 11491 Erasing and Winning
题意: 给你一个n位整数,让你删掉d个数字,剩下的数字要尽量大. 分析: 用了vector数组模拟.如果当前要插入的数>vector数组里的最后一位数,就替换且d-- 代码: #include ...
- UVA-11491 Erasing and Winning (单调队列)
题目大意:给一个数字(开头非0),拿掉其中的d个数字,使剩下的数字最大(前后顺序不能变). 题目分析:拿掉d个数字,还剩下n-d个数字.相当于从n个数字中按先后顺序选出n-d个数字使组成的数字最大,当 ...
- 【uva 11491】Erasing and Winning(算法效率--贪心+单调队列)
题意:有一个N位整数,要求输出删除其中D个数字之后的最大整数. 解法:贪心.(P.S.要小心,我WA了2次...)由于规定了整数的位数,那么我们要尽量让高位的数字大一些,也就是要尽量删去前面小的数字. ...
- BZOJ 2424 订货(贪心+单调队列)
怎么题解都是用费用流做的啊...用单调队列多优美啊. 题意:某公司估计市场在第i个月对某产品的需求量为Ui,已知在第i月该产品的订货单价为di,上个月月底未销完的单位产品要付存贮费用m,假定第一月月初 ...
- HDU 6047 Maximum Sequence (贪心+单调队列)
题意:给定一个序列,让你构造出一个序列,满足条件,且最大.条件是 选取一个ai <= max{a[b[j], j]-j} 析:贪心,贪心策略就是先尽量产生大的,所以就是对于B序列尽量从头开始,由 ...
随机推荐
- 根据PID寻找程序源位置--lsof
ulimit其实就是对单一程序的限制,进程级别的 file-max是所有时程最大的文件数 nr_open是单个进程可分配的最大文件数 确认系统设置的最大文件句柄数 ulimit -a 统计系统中当前打 ...
- 通过关闭 UseDNS和GSSAPIAuthentication选项加速 SSH登录
通常情况下我们在连接 OpenSSH服务器的时候假如 UseDNS选项是打开的话,服务器会先根据客户端的 IP地址进行 DNS PTR反向查询出客户端的主机名,然后根据查询出的客户端主机名进行DNS正 ...
- Spring 中的国际化Message的简单例子(ApplicationContext) 不跟框架集成的版本
首先,建立一个描述message的XML文件,名为messages.xml <?xml version="1.0" encoding="UTF-8" ...
- Haskell语言学习笔记(68)HDBC
安装 HDBC-Sqlite3 $ cabal install HDBC-Sqlite3 Installed HDBC-sqlite3-2.3.3.1 Prelude> :m Database. ...
- Spring Boot中启动HTTPS
一,生成https 的证书 1,在相应的根目录下 keytool -genkey -alias tomcat -storetype PKCS12 -keyalg RSA -keysize -keyst ...
- Filter接口编写过滤器
Filter,过滤器,顾名思义,即是对数据等的过滤,预处理过程.为什么要引入过滤器呢?在平常访问网站的时候,有时候发一些敏感的信息,发出后显示时 就会将敏感信息用*等字符替代,这就是用过滤器对信息 ...
- one by one 项目 part 5
问题汇总 一.Can't connect to MySQL server on 'localhost' (10061)翻译:不能连接到 localhost 上的mysql分析:这说明“localhos ...
- hive 抽样方法
select * from (select *from advert.dws_advert_order_model_sample_pcvr_v2_diwhere dt>= date_sub('$ ...
- cf-Round542-Div2-C(暴力+DFS)
题目链接:http://codeforces.com/contest/1130/problem/C 思路: 利用DFS搜索(r1,c1)和(r2,c2)可到达的点的集合,分别存在a1,a2中,若a1= ...
- clion register
1. 使用 activation code 激活 安装完软件后,启动,在要求输入注册码的界面(菜单栏 ⇒ help ⇒ register)选择“License server”输入“http://ide ...