Content

给定一个整数 \(n\)。每次操作你可以做两件事情中的一件:

  • 删去这个数中的一个数位(如果这个数只剩下一位,则可以把它删空)。
  • 在这个数的右边添加一个数位。

你可以以任意顺序执行无限次操作。但请注意,在删去一个数位之后,这个数可能包含前导零(例如在删去 \(301\) 中的 \(3\) 这一位之后,这个数就会变成 \(01\) 而不是 \(1\))。

你需要执行若干次操作,使得这个数最终变成一个 \(2\) 的次幂,或者说存在一个非负整数 \(k\) 使得这个数最终是 \(2^k\)。最终答案不能包含前导零。请求出需要执行的操作的最小次数。

数据范围:\(t\) 组数据,\(1\leqslant t\leqslant 10^4\),\(1\leqslant n\leqslant 10^9\)。

Solution

这题目讲究的就是一个枚举。由于 \(2\) 的次幂是呈指数级增长的,因此在 \(10^{18}\) 的范围以内的 \(2\) 的次幂也只有 \(59\) 个。所以我们可以直接枚举每一个 \(10^{18}\) 以内的 \(2\) 的次幂,求出当前数修改成每个 \(2\) 的次幂需要的最小操作次数,取最小值即可。这种枚举方法在本题中亲测可过。

其次,如何求出当前数修改成 \(2\) 的次幂的最小操作次数?我们不妨将数转化为字符串,然后考虑尽量多地去做第一种操作,留下 \(2\) 的次幂或者 \(2\) 的次幂的一个前缀,因此这可以转化为求出第一个数字串的最长前缀子序列,直接拿一个指针比对即可。设第一个数字串的长度是 \(l_1\),第二个数字串的长度是 \(l_2\),求出的第一个串的最长前缀子序列的长度为 \(len\),那么最小修改次数就是 \(l_1+l_2-2\cdot len\),因为需要 \(l_1-len\) 次第一种操作将不是子序列中的数字删除,另外还需要 \(l_2-len\) 次第二种操作将 \(2\) 的次幂的前缀变为 \(2\) 的次幂。

注意这里要枚举到 \(10^{18}\),因为它可能在这个数的右边添加一个数位,所以直接枚举到 \(10^9\) 显然无法枚举完整所有的情况。

Code

namespace Solution {
const int N = 67;
int cnt;
string ans[N]; inline string ll_to_str(ll x) {
string ans = "";
ll p = x;
while(p) ans += (p % 10 + '0'), p /= 10;
reverse(ans.begin(), ans.end());
return ans;
}
ii solve(string a, string b) {
int lena = a.size(), lenb = b.size(), j = 0;
F(int, i, 0, lenb - 1) if(b[i] == a[j]) ++j;
return lenb + lena - 2 * j;
} iv Main() {
for(ll i = 1; i <= 1e18; ans[++cnt] = ll_to_str(i), i <<= 1ll);
MT {
string s; cin >> s;
int res = 0x3f3f3f3f;
F(int, i, 1, cnt) res = min(res, solve(ans[i], s));
println(res);
}
return;
}
}

CF1560D Make a Power of Two 题解的更多相关文章

  1. Power Strings[poj2406]题解

    Power Strings Description - Given two strings a and b we define ab to be their concatenation. For ex ...

  2. leetcode 231 Power of Two(位运算)

    Given an integer, write a function to determine if it is a power of two. 题解:一次一次除2来做的话,效率低.所以使用位运算的方 ...

  3. 最短路<dijk>

    题意: 有n个城市,有m条路,给出每条路的出发和结束的城市及长度,求从第一个城市到最后一个城市的最短路.按格式输出. power oj 2443 题解: 标准dijk算法. #include<c ...

  4. LeetCode编程训练 - 位运算(Bit Manipulation)

    位运算基础 说到与(&).或(|).非(~).异或(^).位移等位运算,就得说到位运算的各种奇淫巧技,下面分运算符说明. 1. 与(&) 计算式 a&b,a.b各位中同为 1 ...

  5. 算法与数据结构基础 - 位运算(Bit Manipulation)

    位运算基础 说到与(&).或(|).非(~).异或(^).位移等位运算,就得说到位运算的各种奇淫巧技,下面分运算符说明. 1. 与(&) 计算式 a&b,a.b各位中同为 1 ...

  6. C++题解:Matrix Power Series ——矩阵套矩阵的矩阵加速

    Matrix Power Series r时间限制: 1 Sec 内存限制: 512 MB 题目描述 给定矩阵A,求矩阵S=A^1+A^2+--+A^k,输出矩阵,S矩阵中每个元都要模m. 数据范围: ...

  7. 【题解】Power Strings

    题目描述 给定若干个长度小于等于10^6的字符串,询问每个字符串最多由多少个相同的子串重复连接而成.如:ababab,最多由3个ab连接而成. 输入输出格式 输入格式 若干行,每行一个字符串. 当读入 ...

  8. 洛谷3800:Power收集——题解

    https://www.luogu.org/problemnew/show/P3800 可以把游戏界面理解成一个N行M列的棋盘,有K个格子上有P点,其价值为val(i,j) 初始灵梦可以选择在第一行的 ...

  9. 题解 SP7579 YOKOF - Power Calculus

    SP7579 YOKOF - Power Calculus 迭代加深搜索 DFS每次选定一个分支,不断深入,直至到达递归边界才回溯.这种策略带有一定的缺陷.试想以下情况:搜索树每个节点的分支数目非常多 ...

随机推荐

  1. OAuth 2.1 带来了哪些变化

    OAuth 2.1 是 OAuth 2.0 的下一个版本, OAuth 2.1 根据最佳安全实践(BCP), 目前是第18个版本,对 OAuth 2.0 协议进行整合和精简, 移除不安全的授权流程, ...

  2. es使用java的api操作

    基本环境的创建 pom依赖  <?xml version="1.0" encoding="UTF-8"?> <project xmlns=&q ...

  3. 详解在Linux中安装配置MongoDB

    最近在整理自己私人服务器上的各种阿猫阿狗,正好就顺手详细记录一下清理之后重装的步骤,今天先写点数据库的内容,关于在Linux中安装配置MongoDB 说实话为什么会装MongoDB呢,因为之前因为公司 ...

  4. 【5】肿瘤DNA甲基化数据分析原理及流程

    目录 导论 DNA甲基化基本概论 检测DNA甲基化的方法 DNA甲基化数据分析流程及方法 DNA甲基化在肿瘤研究中的应用 导论 表观遗传:非DNA决定的基因表达,或表型改变中可遗传因素的研究 DNA水 ...

  5. 39-Remove Duplicates from Sorted Array

    Remove Duplicates from Sorted Array My Submissions QuestionEditorial Solution Total Accepted: 127836 ...

  6. fastboot烧写Andriod 以及SD 卡烧写LinuxQT,

    EMMC是一种FLASH,SD(TF)卡是另外的一种存储,通过控制拨码开关指引CPU去读EMMC还是SD卡的u-boot文件. u-boot的作用 初始化内存控制区,访问存储器,把内核从存储器读取出来 ...

  7. 字符scanf 的输入注意

    1.注意scanf 不能有空格,如果有空格会将空格给输入进去 scanf("d "):---有空格 和scanf("d");--没有空格 有很大的区别

  8. JForum论坛安装以及部署

    转载链接:https://blog.csdn.net/jhyfugug/article/details/79467369 首先安装JForum之前,先准备好安装环境Windows7+JDK+Tomca ...

  9. 用原生CSS编写动态字体

    HTML部分: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <t ...

  10. C语言中的各种类型所占的字节大小

    一)64位系统和32位有什么区别?  1.64bit CPU拥有更大的寻址能力,最大支持到16GB内存,而32bit只支持4G内存 2.64位CPU一次可提取64位数据,比32位提高了一倍,理论上性能 ...