Codeforces Round #739 (Div. 3) D. Make a Power of Two(字符串匹配、双指针、贪心)
时间:2021-08-21
本文章向大家介绍Codeforces Round #739 (Div. 3) D. Make a Power of Two(字符串匹配、双指针、贪心),主要包括Codeforces Round #739 (Div. 3) D. Make a Power of Two(字符串匹配、双指针、贪心)使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
-
题意:给出一个n,可以有两个操作,第一个为删除其十进制位上的任一一位,操作次数 +1,第二个为在其右端(尾端)加入一个十进制整数,操作次数 +1,问至少操作几次,可以使得\(n = 2^x(x \geq 0)\)。
-
解析:首先预处理大概\(10^{18}\)内的\(2^x\),假设预处理的每个串为\(t_i\),然后我们的n可以to_string成一个字符串,接着用双指针来计算成功匹配的字符个数,这里的匹配举个例子:t = 1024,s = 1052,那么必须是s与t匹配必须根据t的字符顺序进行匹配,因为实际上s中的一些字符是可以去掉的,例如前两个字符为1、0,均匹配成功,但到第三个字符\(t_2 = 2,s_2 = 5\),此时并不匹配,说明这个字符肯定多余的(最后需要用删除操作将其删除),那么s串只能继续往下找是否存在2,然后发现\(s_3 = 2\),此时可以与\(t_2\)匹配,那么匹配成功的数量num = 3。相当于从s中抽出一些数,这些数组成的序列最多能匹配到t的第几位(必须从第一位开始匹配)。这时的操作数为:s的长度 - num + t的长度 - num。s.len - num 其实是删除字符操作,说明有这么多个字符是多余的,而t.len - num是有这么多个字符没匹配成功,需要从末尾加上去。
- ps:这里的整个过程有点贪心的性质,只要发现能按顺序进行匹配就匹配,否则丢弃该字符。
-
代码:
#include<iostream> #include<cstdio> #include<vector> #include<algorithm> using namespace std; typedef long long ll; vector<string> v; int t; string str_mk(ll x) { string str; if(!x) str += '0'; else { while(x) { int t = x % 10; str += char(t + 48); //str = char(t + 48) + s可以直接把字符接在串前面 x /= 10; } } reverse(str.begin(), str.end()); return str; } void init() { for(int i = 0; i <= 60; i++) { ll x = (ll)1 << (ll)i; string str = str_mk(x); // to_string(x) v.push_back(str); } } int calc(string s, string t) //t为匹配的目标串 { int num = 0; for(int i = 0, j = 0; i < s.size() && j < t.size(); i++) { if(s[i] == t[j]) { num ++; j ++; } } return s.size() - num + (t.size() - num); } int main() { init(); cin >> t; while(t --) { string s; cin >> s; int res = 1000; //随便取个较大的数 for(int i = 0; i < v.size(); i++) { int cnt = calc(s, v[i]); res = min(cnt, res); } cout << res << endl; } return 0; }
原文地址:https://www.cnblogs.com/K2MnO4/p/15169227.html
- centos下升级git版本的操作记录
- linux下core file size设置笔记
- linux下文件加密操作记录
- python的with语句,超级强大
- “AS3.0高级动画编程”学习:第二章转向行为(上)
- Linux下性能调试工具-top和sar运维笔记
- Apache+wsgi+flask部署
- “勒索病毒”到底会勒索啥,尽可以做到让全球对之恐惧无奈!
- 解决win10 关键错误开始菜单和cortana无法工作 的问题(转-真的成功了)
- “AS3.0高级动画编程”学习:第二章转向行为(下)
- windows系统中eclipse C开发环境的架设
- 5个酷毙的Python工具
- ”盒模型“之如何防止边框和内边距把元素撑开
- excel中的不同类型图表叠加
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 单细胞转录组高级分析一:多样本合并与批次校正
- 10元最多可喝多少瓶啤酒?(不可借酒+可借酒,swift语言实现)
- 单细胞转录组高级分析二:转录调控网络分析
- 关于数组内元素是否会被改变的思考
- 排序之选择排序实现(swift)
- 去除友盟等第三方SDK失败的解决办法(clang: error: no such file or directory:xx)
- iOS踩坑之多代理模式使用注意
- 单细胞转录组高级分析三:细胞通讯分析
- 单细胞转录组高级分析四:scRNA数据推断CNV
- 0808-7.1.1-如何在CDP7.1.1指定Hive SQL的资源池队列
- iOS多线程之GCD、OperationQueue 对比和实践记录
- singleR的7个数据库文件下载失败的解决方案
- Spring Boot 如何快速集成 Redis 哨兵?
- 一行命令实现成“吨”测试数据的转码
- Jenkins参数化构建与触发