当前位置: 首页 > news >正文

N. Number Reduction

Problem - 1765N - Codeforces

image-20231004212521844

发现如果是无前导0最小数那么在保证删除k个数时第1位是最小的,第二位一定是相对最小的,且答案第一位和第二位在原位置的间隔是小于等于还可以删除的位数的。

因此,对于原数字长度位n,要删除k,那么答案长度为n - k,这n - k位每一个都是优先选小的,如果不能再选较大值(对于首位比较特殊,不能出现前导零,因此首位从1开始),可以从第1位开始进行枚举0到9将n - k位进行填充。

每一次选完后,这一个数前面可能还有没有选的,但是由于已经选过该位,再选前面的会导致答案变大,因此不要。

可以用10个队列存入每一个数的下标,用一个变量last记录上一个在原数字中选择的数的下标。对每一位依次遍历0到9这10个队列,如果当前数字队列满足条件:

  • 这个数字的下标大于等于上一个下标+1
  • 这个数字的下标跟上一个下标之间差值小于等于还可以删除的次数

满足这些条件时表示下一位是该数字,之后将这个last和还能删除的位进行更新,退出循环到下一位进行判断即可。

代码:

void solve() {string s; cin>>s;int k; cin>>k;int n = s.size();queue<int> q[10];for(int i = 0; i < n; ++i) q[s[i] - '0'].push(i);string ans = "";int last = 0, len = n - k;for(int i = 0; i < len; ++i) {for(int j = (i == 0); j < 10; ++j) {// 如果数字下标小于等于上一个下标,进行出队(因为以后都用不上了,大于上一位的下标才是可能有用的while(q[j].size() && q[j].front() < last) q[j].pop();// 如果满足当前位和上一位之间差值是小于等于还可以删除的数次数,表示可以if(q[j].size() && q[j].front() - last <= k) {ans += j + '0';k -= q[j].front() - last;last = q[j].front() + 1;break;}}}cout<<ans<<endl;
}

CF1765N Number Reduction - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)

http://www.lryc.cn/news/182326.html

相关文章:

  • Java集合面试题
  • Python 编程基础 | 第三章-数据类型 | 3.5、列表
  • Spring Cloud Zuul 基本原理
  • QT实现TCP服务器客户端的实现
  • 行为型设计模式——责任链模式
  • window安装压缩版postgresql
  • 数组(数据结构)
  • C/C++ 二分查找面试算法题
  • Linux基本指令(上)——“Linux”
  • XSS详解
  • 【图论】判环问题
  • 将3D MAX设计模型导入NX1988
  • 操作系统原理实验三:页面调度算法程序
  • QT实现tcp服务器客户端
  • tcp拥塞控制原理
  • 【C++设计模式之简单工厂模式】分析及示例
  • 云原生定义整理
  • 华硕X555YI, Win11下无法调节屏幕亮度
  • 踩坑 | vue动态绑定img标签src属性的一系列报错
  • 强化学习环境 - robogym - 学习 - 1
  • 如果在 Mac 上的 Safari 浏览器中无法打开网站
  • 力扣练习——链表在线OJ
  • 四、互联网技术——局域网拓扑结构
  • Spring Webflux DispatcherHandler源码整理
  • 【Netty】ByteToMessageDecoder源码解析
  • DevEco Studio设置Nodejs提示路径只能包含英文、数字、下划线等
  • 大模型 Decoder 的生成策略
  • 队列和栈相互实现
  • Node.js 是如何处理请求的
  • 数据结构与算法之堆: Leetcode 215. 数组中的第K个最大元素 (Typescript版)