UVA13049 Combination Lock 题解

题意

给你两个 $n$ 位密码锁 $a,b$ 的每一位。

问你至少需要转几次才能把 $a$ 转成 $b$。

比如,把 $2$ 转成 $5$ 至少需要 $3$ 次,把 $7$ 转成 $1$ 至少需要 $4$ 次。

思路

不难发现,把数字 $a$ 转成 $b(a>b)$ 有两种方法:

  1. 直接从 $a$ 一位一位减一转到 $b$。
  2. 先从 $a$ 转到 $9$,$9\rightarrow0$,再从 $0$ 转到 $b$。

同理,从 $b$ 转到 $a$ 也是这两种方法。

显而易见,第一种需要 $a-b$ 次,

第二种需要 $(9-a)+1+(b-0)=10-a+b$ 次。

所以只需要分别算出两种方法的转动次数,取更少的即可。

代码

#include <iostream>
#include <string>
using namespace std;
int t;string a, b;
int main()
{
    cin >> t;
    for(int k = 1, n, ans;k <= t;++k)
    {
        cin >> n >> a >> b;ans = 0;
        for(int i = 0;i < n;++i)
        {
            int p = a[i], q = b[i];
            if(p < q) swap(p, q);
            ans += min(p - q, 10 - p + q);
        }
        cout << "Case " << k << ": " << ans << endl;
    }
    return 0;
}
posted @ 2021-12-10 16:27  5k_sync_closer  阅读(8)  评论(0编辑  收藏  举报  来源