删数问题(n位数,删掉k位,使其最大)
来源:互联网 发布:永恒网络 编辑:程序博客网 时间:2024/06/15 21:37
中石油:http://exam.upc.edu.cn/problem.php?id=4509
【问题】:
给出一个n位数,要求删掉其中k位数字,使得剩下的数字组成的数尽量大。
输入
第1行:两个正整数n, k(1 <= k < n <= 500,000)。
第2行:一个n位正整数(无前导0)。
第2行:一个n位正整数(无前导0)。
输出
输出一行,一个正整数,表示剩下的数的最大值。
样例输入
4 21924
样例输出
94
【解析】:
目的是使得高位尽量大。
贪心
因此,从左边开始扫,设两个下标,l和r
r一直往右走。
l始终在r的左边
只要a[l]<a[r],就把l删掉,因为保留a[r]会更好
否则,r++,l从r的左边重新执行这个过程
这个过程执行完,一定会剩下一个不上升的序列,需要继续删的话,从右边开始删小数。
【代码】:
#include <stdio.h> #include <string.h> #include <iostream> #define mset(a,i) memset(a,i,sizeof(a)) using namespace std; typedef long long ll; const int MAX=1e6+5; char a[MAX]; int vis[MAX]; int main() { int n,k,i,j; while(cin>>n>>k) { scanf("%s",a); int l=0,r=1; mset(vis,0); while(k&&r<n)//删升的 { while(k&&l>=0&&a[l]<a[r]) { vis[l]=1; k--; while(l>=0&&vis[l])l--; } l=r;r++; } r=n-1; while(k&&r>=0){//扫描剩下的不升序列 if(!vis[r]){ vis[r]=1; k--; } r--; } int flag=1; for(int i=0;i<n;i++) { if(!vis[i]){ flag=0; printf("%c",a[i]); } } if(flag)printf("0"); puts(""); } return 0; }
阅读全文
0 0
- 删数问题(n位数,删掉k位,使其最大)
- 从一个n位数中选出m位按顺序组成新数并使其最大 || Erasing and Winning UVA
- python--n位数删除k位得到最小数
- 给定一个N位数,得到一个N-k位的数中最小的数
- 给定一个N位数,得到一个N-k位的数中最小的数
- 一个n位的数,去掉其中的k位,问怎样去使得留下来的(n-k)位数按原来的前后顺序组成的数最小
- 一个n位的数,去掉其中的k位,问怎样去使得留下来的(n-k)位数按原来的前后顺序组成的数最小
- 给定N位数,去掉K位数,得到的N-K位数中最小的那个数?
- 打印1到最大的n位数(大数问题)
- 打印1到最大的n位数 题目:输入数字n,按顺序打印出从1最大的n位十进制数。
- NBUT 1181 Big Mouth of Abyss - Kog'Maw(删k位留最大最小数)
- n位数,去除m位,获得最大的值
- 贪心算法:N位数删除K个数字,使剩下的数字串最小
- 算法题—n位正整数去掉k(k<=n)位数字得到最小数
- 打印1到n位最大数
- 求解两个n位数相乘的最大回文数(Python实现,效率较高)
- 打印从1到n位数的最大数
- 求 Fibonacci 数第n位的位数 ~高精度
- hdfs写文件流程
- Spark---JVM调优之原理以及降低cache操作的内存占比
- C++面试必知必会 (1)
- LinuxIO多路复用之epoll
- 第一天
- 删数问题(n位数,删掉k位,使其最大)
- shell 基础
- Java根据模板生成excel并下载
- Xilinx SDK 工程添加include 路径
- Django常用命令
- Android 应用和系统优化V1.2
- 十道海量数据处理面试题与十个方法大总结
- super.getClass()方法调用
- 技术岗面试笔试算法题详解(一)