ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

ABC 235 D - Multiply and Rotate(bfs)

2022-09-06 21:31:50  阅读:215  来源: 互联网

标签:ABC dist 数字 LL Sample Output Input Multiply 235


https://atcoder.jp/contests/abc235/tasks/abc235_d

题目大意:
给定一个数字x作为倍数,给定一个要从1变成的目标数字n。
有两种操作:
第一种是每次都可以*x;
第二种是在当前>10并且最后一位不为0的情况下,把数字的最后一位提前到第一位来形成一个新的数字。

问我们从1变成n的最小操作是多少?
如果实在变不成,就输出-1。

数据范围是在1e6内
Sample Input 1  
3 72
Sample Output 1  
4 

Sample Input 2  
2 5
Sample Output 2  
-1 

Sample Input 3  
2 611
Sample Output 3  
12 

Sample Input 4  
2 767090
Sample Output 4  
111

当我们面对这种数据范围小的数字变换的题目时,首先该想的就是能不能爆搜
每次在原数字的基础上*x是多一种情况
每次提一下尾部是多一种情况
结合数据范围较小的情况下来看,我们就可以想到bfs
这个题目的变换部分确实烦啊~

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<int,int> PII;
const int N=2002000,M=2002;
const int INF=0x3f3f3f3f;
LL x,n;
LL dist[N];
bool vis[N];
int cal(LL xx)
{
    if(xx<10||xx%10==0) return 1e8;
    LL y=xx/10;//取到了最后一位之前的
	LL len=log10(xx);
	xx=xx%10;//最后一位数字
	LL num=y+xx*pow(10,len);
	return num;
}
int main()
{
    cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
    int T=1;
    //cin>>T;
    while(T--)
    {
        cin>>x>>n;
        memset(dist,-1,sizeof dist);
        queue<LL> q;
        q.push(1);
        dist[1]=0;
        while(q.size())
        {
            auto t=q.front();
            q.pop();
            if(t==n) break;
            if(t*x<1e6&&dist[t*x]==-1)
            {
                dist[t*x]=dist[t]+1;
                q.push(t*x);
            }
            LL ans=cal(t);
            if(ans<1e6&&dist[ans]==-1)
            {
                dist[ans]=dist[t]+1;
                q.push(ans);
            }
        }
        cout<<dist[n]<<endl;
    }
    return 0;
}

标签:ABC,dist,数字,LL,Sample,Output,Input,Multiply,235
来源: https://www.cnblogs.com/Vivian-0918/p/16663357.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有