# 2009 . 數字密碼鎖(Lock) ###### tags: `競程題解`,`競程` idea: 從頭到去找到第一個不同的地方,然後以這個地方開始向右$k$去做變換 直到這個不同的地方與目標相同即可。 why 是向右 而不是向左? > 可以檢查到這個點的前提是,前面的都已經與目標相同ㄌ > 所以去改變那些已經是相同的是毫無意義的 為什麼毫無意義? 因為去改了前面(左邊)那些已經排好的 一定會導致從這個點開始前面$k-1$個數字會不同 不同的距離是 $dis(now-tar)$ //編輯距離 那這$k-1$個是永遠無法符合目標的。 所以說就找到不同的,然後向右去改,先把目前這個點處理掉,再去處理接下來的。 ```CPP= #include "iostream" using namespace std; int tob[10010]={},now[10010]={}; inline int add(int now){ now++; if(now==10)now=1; return now; } int main(){ ios::sync_with_stdio(0),cin.tie(0); int n,k; cin>>n>>k; for(int i=0;i<n;i++){ cin>>now[i]; } for(int i=0;i<n;i++){ cin>>tob[i]; } int ad=0; for(int i=0;i<=n-k;i++){ while(now[i]!=tob[i]){ ad++; for(int j=i;j<i+k;j++){ now[j]=add(now[j]); } } } for(int i=n-k;i<n;i++){ if(tob[i]!=now[i]){ cout<<"0\n"; return 0; } } cout<<ad; } ```