日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Luggage Lock 偏移,bfs,预处理(2021.11.沈阳)

發(fā)布時間:2025/3/19 编程问答 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Luggage Lock 偏移,bfs,预处理(2021.11.沈阳) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.


題意 :

  • 要從a0a1a2a3a_0a_1a_2a_3a0?a1?a2?a3?變化到b0b1b2b3b_0b_1b_2b_3b0?b1?b2?b3?,求最小操作次數(shù),每次操作可以選擇一個區(qū)間[l,r][l,r][l,r],使得?l≤i≤r,ai=(ai+/?1)mod10\forall l\leq i \leq r,a_i = (a_i +/- 1) mod 10?lir,ai?=(ai?+/?1)mod10

思路 :

  • 首先考慮暴力的做法,從a0a1a2a3a_0a_1a_2a_3a0?a1?a2?a3?bfs,直到走到b0b1b2b3b_0b_1b_2b_3b0?b1?b2?b3?跳出,轉(zhuǎn)移時采用記憶化,總共的狀態(tài)數(shù)是10410^4104,即每次求出一組樣例最壞復(fù)雜度為10410^4104,總的就是10910^9109,無法通過
  • 因此我們考慮預(yù)處理,但預(yù)處理出每一種狀態(tài)到其他每種狀態(tài)的最小步數(shù)是10810^8108,不一定能過
  • 因此我們考慮預(yù)處理0000到其他狀態(tài)的最小步數(shù),從a0a1a2a3a_0a_1a_2a_3a0?a1?a2?a3?b0b1b2b3b_0b_1b_2b_3b0?b1?b2?b3?相當(dāng)于從0000到c0c1c2c3c_0c_1c_2c_3c0?c1?c2?c3?,做偏移處理
  • 每次操作,相當(dāng)于一次區(qū)間修改,從0000到0110就是對[1,2][1,2][1,2]這個區(qū)間整體加1,每次操作,都可以選擇10個區(qū)間 :[0,0],[0,1],[0,2],[0,3],[1,1],[1,2],[1,3],[2,2],[2,3],[3,3][0,0],[0,1],[0,2],[0,3],[1,1],[1,2],[1,3],[2,2],[2,3],[3,3][0,0],[0,1],[0,2],[0,3],[1,1],[1,2],[1,3],[2,2],[2,3],[3,3],對每個區(qū)間,都有兩種撥碼方法(向上或向下?lián)芤桓?#xff09;
  • 所以,每個狀態(tài)a0a1a2a3a_0a_1a_2a_3a0?a1?a2?a3?進(jìn)行一次操作可以轉(zhuǎn)換成另外20個數(shù)字
  • 將0000到9999看作10510^5105個結(jié)點(diǎn),每個結(jié)點(diǎn)有20個邊,每個邊的長度是1,那么,從0000轉(zhuǎn)換為c0c1c2c3c_0c_1c_2c_3c0?c1?c2?c3?的最少步驟,就等于這個無向圖上0000到c0c1c2c3c_0c_1c_2c_3c0?c1?c2?c3?的最短路徑
#include <iostream> #include <algorithm> #include <cstring> #include <vector> #include <unordered_set> #include <math.h> using namespace std;typedef long long ll; typedef pair<int, int> PII;#define endl '\n' #define fi first #define se second #define push_back #define rep(i, l, r) for (ll i = l; i <= r; i ++ )const int N = 10000, inf = 0x3f3f3f3f;int q[N]; bool st[N]; int d[N]; int a[10];int calc(int x, int l, int r, int k) {if (k == 0) k = -1;string s = to_string(x);s = string(4 - s.size(), '0') + s;int num = 0;for (int i = 0; i <= 3; i ++ ){if (i >= l && i <= r)num = num * 10 + (s[i] - '0' + 10 + k) % 10;elsenum = num * 10 + (s[i] - '0');}return num; }void solve() {string x, y; cin >> x >> y;for (int i = 0; i <= 3; i ++ ) a[i] = (y[i] - x[i] + 10) % 10;int num = 0;for (int i = 0; i <= 3; i ++ ) num = num * 10 + a[i];cout << d[num] << endl; }int main() {cin.tie(nullptr) -> sync_with_stdio(false);for (int i = 0; i <= 9999; i ++ ) d[i] = inf;int hh = 0, tt = -1;q[ ++ tt] = 0;st[0] = true;d[0] = 0;while (hh <= tt){int t = q[hh ++ ];for (int i = 0; i <= 3; i ++ )for (int j = i; j <= 3; j ++ )for (int k = 0; k <= 1; k ++ ){int point = calc(t, i, j, k);if (!st[point]) q[ ++ tt] = point, st[point] = true, d[point] = d[t] + 1;}}int _;cin >> _;while (_ -- )solve();return 0; } 與50位技術(shù)專家面對面20年技術(shù)見證,附贈技術(shù)全景圖

總結(jié)

以上是生活随笔為你收集整理的Luggage Lock 偏移,bfs,预处理(2021.11.沈阳)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。