UVA13049 Combination Lock 题解
题意
给你两个 $n$ 位密码锁 $a,b$ 的每一位。
问你至少需要转几次才能把 $a$ 转成 $b$。
比如,把 $2$ 转成 $5$ 至少需要 $3$ 次,把 $7$ 转成 $1$ 至少需要 $4$ 次。
思路
不难发现,把数字 $a$ 转成 $b(a>b)$ 有两种方法:
- 直接从 $a$ 一位一位减一转到 $b$。
- 先从 $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;
}