题目描述
有一十进制正整数,移除其中的 K 个数,使剩下的数字是所有可能中最大的。
假设:
字符串的长度一定大于等于 K
字符串不会以 0 开头
输入描述:

一行由正整数组成的数字字符串,和一个正整数 K,两个数据用空格隔开,如:1432219 3。
字符串长度不超过2000,K<=2000。

输出描述:

移除 K 位后可能的最大的数字字符串。
1432219移除 1, 2, 1这 3 个数字后得到 432,为所有可能中的最大值。

示例1
输入
复制

1432219 3

输出
复制

4329

可以发现 :

  1. 一个数字数组可以划分成很多个子数组,这些子数组可能单调增 单调减 或者平滑不变
  2. 如果这个数num=12349685num=12349685num=12349685以递增子数组开头,则只要还可以删除数字,删开头一定最优
  3. 如果这个数num=43217892num=43217892num=43217892以递减子数组开头,且能删的个数小于4,则开头一定不能删
    应该删除321321321则三个数
  4. 只要还能删,我们就必须留下最长单调减序列,一定是最优答案

考虑单调栈(看别人的代码才知道的,一开始考虑贪心自闭了很久)

  • 只要当前数字num[i]num[i]num[i]比栈顶大,并且还能删除,则删除栈顶,并把num[i]num[i]num[i]入栈
  • 当forforfor完整个数字数组还有可以删除的个数kkk,则进行kkk次弹栈
  • 最后 , 把栈内的数字翻转reversereversereverse就是答案
//设数字为24593215
//如果[0,K]是递增的,删掉[0,cnt(cnt<K)]会使得答案增大
//找到所有递增序列,删掉string str;
cin >> str >> K;
stack<char> stk;
for(auto ch : str) { //把每个数字和栈顶比较while(stk.size() && stk.top() < ch && K) { //只要还能删除 且 栈顶小于num[i]就退栈stk.pop();K --;}stk.push(ch); //num[i]入栈
}
string ans;
while(K--) { //删到最后还能删,继续退栈stk.pop();
}
while(!stk.empty()) {ans.push_back(stk.top());stk.pop();
}
reverse(ans.begin(), ans.end()); //记得翻转
cout << ans << endl;

完整代码

#define debug
#ifdef debug
#include <time.h>
#include "/home/majiao/mb.h"
#endif#include <iostream>
#include <algorithm>
#include <vector>
#include <string.h>
#include <map>
#include <set>
#include <stack>
#include <queue>
#include <math.h>#define MAXN ((int)1e5+7)
#define ll long long int
#define INF (0x7f7f7f7f)
#define fori(lef, rig) for(int i=lef; i<=rig; i++)
#define forj(lef, rig) for(int j=lef; j<=rig; j++)
#define fork(lef, rig) for(int k=lef; k<=rig; k++)
#define QAQ (0)using namespace std;#define show(x...) \do { \cout << "\033[31;1m " << #x << " -> "; \err(x); \} while (0)void err() { cout << "\033[39;0m" << endl; }
template<typename T, typename... A>
void err(T a, A... x) { cout << a << ' '; err(x...); }namespace FastIO{char print_f[105];void read() {}void print() { putchar('\n'); }template <typename T, typename... T2>inline void read(T &x, T2 &... oth) {x = 0;char ch = getchar();ll f = 1;while (!isdigit(ch)) {if (ch == '-') f *= -1; ch = getchar();}while (isdigit(ch)) {x = x * 10 + ch - 48;ch = getchar();}x *= f;read(oth...);}template <typename T, typename... T2>inline void print(T x, T2... oth) {ll p3=-1;if(x<0) putchar('-'), x=-x;do{print_f[++p3] = x%10 + 48;} while(x/=10);while(p3>=0) putchar(print_f[p3--]);putchar(' ');print(oth...);}
} // namespace FastIO
using FastIO::print;
using FastIO::read;int n, m, Q, K;
bool up[MAXN], vis[MAXN];int main() {#ifdef debugfreopen("test", "r", stdin);clock_t stime = clock();
#endif//设数字为24593215//如果[0,K]是递增的,删掉[0,cnt(cnt<K)]会使得答案增大//找到所有递增序列,删掉string str;cin >> str >> K;stack<char> stk;for(auto ch : str) {while(stk.size() && stk.top() < ch && K) {stk.pop();K --;}stk.push(ch);}string ans;while(K--) {stk.pop();}while(!stk.empty()) {ans.push_back(stk.top());stk.pop();}reverse(ans.begin(), ans.end());cout << ans << endl;#ifdef debugclock_t etime = clock();printf("rum time: %lf 秒\n",(double) (etime-stime)/CLOCKS_PER_SEC);
#endif return 0;
}

牛客 小米校招 最大新整数 单调栈相关推荐

  1. 牛客 小米校招 计算题 单调栈 接雨水

    给定n个非负整数表示每个宽度为1的柱子的高度题,计算按此排列的柱子,下雨之后能接多少雨水. 经典的题目 leetcode 42 接雨水 单调栈 保持栈内单调递减 每次把一个矮的出栈都能够加上一大块面积 ...

  2. *【牛客 - 318B】签到题(单调栈,水题)

    题干: 众所周知,IG是英雄联盟S8世界总决赛冠军,夺冠之夜,数亿人为之欢呼! 赛后某百分百胜率退役ADC选手的某表情包意外走红,某苟会长看到此表情包也想模仿. 于是有n个友爱的萌新决定每人都送会长一 ...

  3. 牛客 小米校招 小明的字符串 循环队列

    题目描述 小明同学需要对一个长度为 N 的字符串进行处理,他需要按照要求执行若干步骤,每个步骤都均为下面 2 种操作中的一种,2 种操作如下: TYPE 1. 从字符串结尾开始算起,将第 X 个字符之 ...

  4. 牛客 小米校招 分布式集群消息传递最短路模板题

    题目描述 有一个分布式服务集群,集群内含有 N 个服务节点,分别标记为 1 到 N. 给予一个列表 times,表示消息从两个节点间有向传递需要的时间. times[i] = (s, d, t),其中 ...

  5. 判断作弊 牛客 编程_牛客企业服务产品-新功能速递-第5期

    <牛客企业服务产品功能速递> 栏目,旨在帮 助企业用户及时了解牛客企业服务产品功能更新/新增,让用户第一时间了解和使用我们的新产品/功能.锁定<牛客企业服务产品新功能速递>,我 ...

  6. 2020年牛客网校招编程笔试题相关问题

    这里主要是介绍一些关于牛客网上面编程题笔试系统的一些容易踩的坑.希望大家春招顺利!据说点一下关注可以拿到满意的 offer! 1. 接口类型测试 牛客网的编程题目分为两种形式,第一种形式是完善核心代码 ...

  7. 牛客网校招题题目收集----数据结构与算法篇

    选择题 a,b,c,d,e 对应出现的频率为4,6,11,13,15:以下符合哈夫曼编码的选项是?() A. a=000.b=01.c=001.d=10.e=11 B. a=000.b=001.c=0 ...

  8. 牛客 - 把字符串转换成整数

    牛客 解题思路: 1.处理字符串为空 , 字符串中除了首位存在不是数字字符. 2.处理符号位,将符号位设为0 (如果有的话) class Solution { public:int StrToInt( ...

  9. 牛客2018校招 1. 拼多多 大整数相乘

    解题的思路并不复杂:模拟算数的乘法运算过程 但是一次直接AC还是比较困难的. 注意点: 1.进位 每一轮的进位最终存在的话,还需要加上 2.高位和低位的存储问题 3.输入,输出问题 输出ACM,采用S ...

最新文章

  1. 云服务蓬勃发展,平均年增长率高达28%
  2. java要频繁调用容器时_JAVA基础面试题
  3. 四大数据库的比较(SQL Server、Oracle、Sybase和DB2)
  4. 如何设置窗口立即刷新显示
  5. Oracle 原理: 11g的启动和关闭
  6. 面对这么多困境,梅耶尔还能怎么应对?
  7. 如何访问SAP Spartacus里的config数据
  8. shiro学习(2):第一个shiro程序
  9. 计算机控制常用数据通信标准,计算机系统第6章通信ppt课件.ppt
  10. JAVA读锁不使用效果一样_Java使用读写锁替代同步锁
  11. python外部库matlab_python调用MATLAB库绘制直方图
  12. PcShare,PcClient 后门手工解决方案
  13. 简历太空白怎么办?如何写简历
  14. 苏州银行对公存款业务模块维护
  15. win10计算机停止工作,360重装Win10系统后如何应对已停止工作提示的办法
  16. 第0讲:树莓派是什么?能做什么?
  17. 关于网线连内网,无线连外网,内外网同时连通的方法探究
  18. M - Bombs CodeForces - 350C(方格,模拟)
  19. 整理的strace命令参考文档
  20. 第三章:可行性研究及需求分析

热门文章

  1. 学习Chrome Devtools 调试
  2. tableau连接MySQL
  3. pdf怎么转换成jpg图片效果好
  4. matlab 符号微积分
  5. opencv 白平衡之灰度世界算法
  6. 教你如何将360全景图免费下载到本地,并生成全景漫游
  7. 普吉岛自由行——泰囧准备篇
  8. 实测 Google 全同态加密FHE,效果如何?
  9. Html5 Egret游戏开发 成语大挑战(六)游戏界面构建和设计
  10. 用图片制作radio单选按钮