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序列尽量从头开始,由 ...
随机推荐
- python远程调试及celery调试
部分来自 from: https://www.xncoding.com/2016/05/26/python/pycharm-remote.html 你是否经常要在Windows 7或MAC OS X上 ...
- 解决Linux命令行为什么变成-bash-3.2$
在Linux服务器上创建了一个新用户probe,是这样创建的: [root@localhost home]# groupadd -g 501 probe [root@localhost home]# ...
- js中函数的使用方式及回调函数
<!DOCTYPE html><html lang="en"><head> <meta charset="UTF-8" ...
- JAVA数据类型(转载)
JAVA中值类型的只有short,char,byte,int,long,double,float,boolean八大基本类型,其他的所有类型都是引用类型. 首先我们都知道在编程中赋值运算“=”的意思是 ...
- ORACLE system表空间满
解决方法:执行迁移命令,将AUD$表相关移到其它表空间中,也可以新建 一个审计 表空间 / MB DESC) ; alter table aud$ move tablespace SIEBELINDE ...
- VB 共享软件防破解设计技术初探(三)
×××××××××××××××××××××××××××××××××××××××××××××× 其他文章快速链接: VB 共享软件防破解设计技术初探(一)http://bbs.pediy.com/sho ...
- Python3 open() 函数
Python3 open() 函数 Python3 内置函数 Python open() 方法用于打开一个文件,并返回文件对象,在对文件进行处理过程都需要使用到这个函数,如果该文件无法被打开,会抛出 ...
- 36. Valid Sudoku (Array; HashTable)
Determine if a Sudoku is valid, according to: Sudoku Puzzles - The Rules. The Sudoku board could be ...
- 37. Sudoku Solver (Array;Back-Track)
Write a program to solve a Sudoku puzzle by filling the empty cells. Empty cells are indicated by th ...
- sqlite小知识
删除数据时,由于缓存关系,数据了文件大小不会一下子减小,可以通过执行vacuum;或新建表时使用自动整理大小来实现. sqlite的大小理论上可以达到140T. 暂时,使用C的api,只能使用不是.开 ...