首页 > 其他分享 >Gym - 103427J Luggage Lock

Gym - 103427J Luggage Lock

时间:2023-01-09 23:57:40浏览次数:70  
标签:10 0000 int Lock Gym str 103427J include 预处理

Gym - 103427J Luggage Lock

题解:BFS预处理+偏移

首先我们考虑暴力做法,对于每次查询我们都去找出\(a_0a_1a_2a_3\)到\(b_0b_1b_2b_3\)的最小步骤,如果给你0000->9999,我们需要遍历1e4中状态,所以1e5次查询,显然数量级为1e9>1e8

所以我们肯定要考虑预处理,那怎么预处理呢?

我们来看一个例子:

2356-->4273 我们对他做偏移处理得到:0000-->2927,那么是不是就意味着两者从前一种状态到后一种状态的最小步骤是一样的,所以我们可以先预处理出0000到所有情况的最短步骤,然后对于每次的询问,我们进行偏移处理,变成0000-->\(c_0c_1c_2c_3\)的情况,这样能够实现\(O(1)\)询问

我们再来看怎么去BFS,首先他只能对一个连续的区间进行上拨和下拨,所以我们只要对[0,0] , [0,1], [0,2]....[3,3]

共10个区间进行上拨和下拨的操作,这样实际上每个点有20条边,所以实际上\(a_0a_1a_2a_3\)可以转化为另外20个数字,同时我们利用map进行记忆化和存储预处理结果

#include <iostream>
#include <algorithm>
#include <map>
#include <unordered_map>
#include <string>
#include <string.h>
#include <ctype.h>
#include <vector>
#include <math.h>
#include <queue>
#define Zeoy std::ios::sync_with_stdio(false), std::cin.tie(0), std::cout.tie(0)
#define all(x) (x).begin(), (x).end()
#define endl '\n'
using namespace std;
typedef long long ll;
const int mod = 1e9 + 7;
const double eps = 1e-9;
const int N = 4e4 + 10;
int n, m;
map<string, ll> mp;				//存储预处理结果和进行记忆化搜索
struct node
{
    string str;
    ll step;
};
void bfs()
{
    queue<node> q;
    node t;
    t.str = "0000";				//从初始0000开始,但是可以是任意状态开始
    t.step = 1;					//设为1,防止直接退出循环
    q.push(t);
    while (q.size())
    {
        t = q.front();
        q.pop();
        if (mp[t.str])			//记忆化
            continue;
        mp[t.str] = t.step;
        for (int i = 0; i < 4; ++i)        // 往上转共10种情况
        {
            for (int j = i; j < 4; ++j)
            {
                string s = t.str;
                for (int k = i; k <= j; ++k)
                {
                    s[k] = (s[k] - '0' + 1) % 10 + '0';
                }
                node tmp;
                tmp.str = s;
                tmp.step = t.step + 1;
                q.push(tmp);
            }
        }
        for (int i = 0; i < 4; ++i)			// 往下转共10种情况
        {
            for (int j = i; j < 4; ++j)
            {
                string s = t.str;
                for (int k = i; k <= j; ++k)
                {
                    s[k] = (s[k] - '0' + 10 - 1) % 10 + '0';
                }
                node tmp;
                tmp.str = s;
                tmp.step = t.step + 1;
                q.push(tmp);
            }
        }
    }
}
int main(void)
{
    Zeoy;
    int t = 1;
    bfs();
    cin >> t;
    while (t--)
    {
        string s1, s2;
        cin >> s1 >> s2;
        string ans = "0000";
        for (int i = 0; i < 4; ++i)
        {
            ans[i] = (s2[i] - s1[i] + 10) % 10 + '0';
        }
        cout << mp[ans] - 1 << endl;
    }
    return 0;
}

标签:10,0000,int,Lock,Gym,str,103427J,include,预处理
From: https://www.cnblogs.com/Zeoy-kkk/p/17038902.html

相关文章

  • Java并发容器之PriorityBlockingQueue源码分析
    一、简介PriorityBlockingQueue是java并发包下的优先级阻塞队列,它是线程安全的,如果让你来实现你会怎么实现它呢?还记得我们前面介绍过的PriorityQueue吗?点击链接直达Java......
  • P8932 [JRKSJ R7] Clock Paradox 题解
    在洛谷上阅读Part0题意简述原题这场月赛我唯一AC的题给出一个字符串\(S\),令\(T=S\),求使用\(S\)的子串插入\(T\),将\(T\)变形的最少的操作次数。且字符串\(S\)......
  • AZ-500 Lab-configure a lock for the app service plan
    由于微软Azure平台界面一直都在变,所以通过考试的关键,是真正理解lab题要表达的意思,不要死记硬背。SIMULATION-Youneedtopreventadministratorsfromperformingacciden......
  • [oeasy]python0041_teletype历史_博多码_shift_capslock_字符数字切换_gear
    teletypewriter历史回忆上次内容上次见到了一个真的机械打字机感受到了蒸汽朋克的时代背景上上次区分了一些概念terminal终端,电脑连线最终的端点TeleTYpewr......
  • Java并发容器之LinkedBlockingQueue源码分析
    一、简介LinkedBlockingQueue是java并发包下一个以单链表实现的阻塞队列,它是线程安全的,至于它是不是有界的,请看下面的分析。二、源码分析2.1属性 //容量private......
  • BitLocker驱动器加锁和解锁
    应用场景:单位配备给你使用的电脑(Win10系统),偶尔也会有其他人使用。你可以设置某一个磁盘为你的私密数据存储空间,只有你输入密码后才能进入磁盘。即使系统重装、硬盘被拆......
  • BlockingQueue之LifoSemMPMCQueue
    【五种阻塞队列】  【先看LifoSem】lastinfirstout信号量通知的queue【调用栈】  ./fbcode_builder_getdeps-ZrootZfollyZbuildZfbcode_builder-root/buil......
  • resin报错:java.lang.IllegalStateException: block Block
    java.lang.IllegalStateException:blockBlock启动resin时报错主要的提示信息就是下面这个java.lang.IllegalStateException:blockBlock[Table[mnode:2,d:\XXXX\resi......
  • Troubleshooting gc block lost and Poor Network Performance in a RAC Environment
    Environment:OracleLinuxRedHatLinuxOracle11GOracle12CSymptoms:Highclusterwaitandperformancelossduetoclusterwait.Diagnose:[root@node2......
  • safety-gym 环境配置
    safety-gym safety-gym的安装还是相当繁琐的,这里记录一下如何在linux系统上配置safety-gym  1.到mojuco官网下载mujoco200的压缩包和密钥 mujoco200压缩......