EVERYTHING HAPPENS FOR THE BEST!|

wnsyou

园龄:2年4个月粉丝:19关注:16

2023-05-17 21:00阅读: 29评论: 0推荐: 0

abc235_d Multiply and Rotate 题解

Multiply and Rotate

题意

给定两个整数 an,有一个整数 x,初始值为 1,有两种操作:

  1. x 变成 x×a
  2. x>10x 不是十的倍数的情况下可以执行此操作:x 当成一个字符串,将其循环右移一次。

求最少执行多少次操作能把 x 变成 n,若无法将其变为 n,输出 -1

思路

简单的广搜题。

首先,我们可以发现,操作 1 只能把 x 变大,操作 2 既可以变小也可以变大,但并不能把 x 的位数缩小,所以就可以推出来:当 x 的位数比 n 多时,是不可能再经过若干次操作变成 n 的,也就自然不用往下进行了。

有了这个剪枝,这题也就可以轻松地过掉了。

详见代码。

Code

点击查看代码
#include <iostream>
#include <queue>
using namespace std;
const int MAXN = 1e6 + 10, INF = 1e6;
int a, n, f[MAXN];
queue<long long> q;
void Record (long long x, int lv) {
if (x >= INF || f[x] != -1) { // 这种情况不合法或者有更优的操作次数
return ; // 筛掉
}
f[x] = lv; // 记录
q.push(x);
}
// 操作 2 会将最低位移到第高位,这里就是在求需要乘几才能把它移到最高位
long long W (long long x) {
long long sum = 1;
while (x) {
x /= 10;
sum *= 10;
}
return sum / 10;
}
void bfs () {
Record(1, 0); // 初始状态
while (!q.empty()) {
long long t = q.front();
q.pop();
Record(t * a, f[t] + 1); // 操作 1
if (t > 10 && t % 10) { // 满足要求,可以执行操作 2
Record(t / 10 + (t % 10) * W(t), f[t] + 1); // 操作 2
}
}
}
int main(){
ios::sync_with_stdio(0), cin.tie(0);
cin >> a >> n;
for (int i = 1; i < INF; i++) { // 无脑初始化
f[i] = -1;
}
bfs();
cout << f[n]; // 输出答案
return 0;
}

本文作者:wnsyou の blog

本文链接:https://www.cnblogs.com/wnsyou-blog/p/17410267.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   wnsyou  阅读(29)  评论(0编辑  收藏  举报
  1. 1 勝利への道 安藤浩和
  2. 2 Minecraft’s End Eric Fullerton
  3. 3 月光曲完整版 贝多芬 云熙音乐
  4. 4 平凡之路 (Live版) 朴树
  5. 5 Minecraft C418
  6. 6 Paradise NiziU
  7. 7 叫我,灰原哀 龙大人不喷火
  8. 8 心机之蛙,一直摸你肚子 ——《名侦探柯南》原创同人曲 炊饭,叶辞樱,温海,寒砧,南柯柯,小茜玛姬,盛姝,阿崔Ac,贝壳初,千湛,兮茶子DaYu,乔慕,黎鹿北,起千温卿,遮阳伞,曲悠
  9. 9 战 歌 此去经年
月光曲完整版 贝多芬 - 云熙音乐
00:00 / 00:00
An audio error has occurred, player will skip forward in 2 seconds.

暂无歌词

加载中…

{{tag.name}}

{{tran.text}}{{tran.sub}}
无对应文字
有可能是
{{input}}
尚未录入,我来提交对应文字
评论
收藏
关注
推荐
深色
回顶
收起
点击右上角即可分享
微信分享提示