CF1674B Dictionary 题解
题意简述
| 序号 | 字母 |
|---|---|
| $ 1 $ | ab |
| $ 2 $ | ac |
| ... | ... |
| $ 25 $ | az |
| $ 26 $ | ba |
| $ 27 $ | bc |
| ... | ... |
| $ 649 $ | zx |
| $ 650 $ | zy |
给定两个小写字母,依照上面的方式转成 10 进制的数字。
Sol:
这道题是 26 进制的 Plus 版——要求两个字母不能相同。
设 第一个字母 为 $c_1$,第二个字母 为 $c_2$。
$c_1$ 代表若干个 25 之和,$c_2$ 则满 25 进 1,。
下面用 $ f(c) $ 表示字母 $ c $ 的序号。
对于 $c_1$:
所代表的数为 $ ( f(c_1) - f(a) ) \times 25$。
对于 $c_2$:
可以 以 $c_1$ 为界,把除 $c_1$ 以外的 25 个字母分为两类。对于序号小于 $c_1$ 的 $c_2$,所表示的数为 $ f(c_2) - f(a) + 1$;对于序号大于 $c_1$ 的 $c_2$,所表示的数为 $ f(c_2) - f(a) $。
设 $ t = ( f(c_1) - f(a) ) \times 25 + f(c_2) - f(a) $。
当 $ f(c_1) < f(c_2) $ 时,答案 $ ans = t $;
当 $ f(c_1) > f(c_2) $ 时,答案 $ ans = t + 1 $。
代码
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#define ll long long
using namespace std;
int main(){
ll T;
cin >> T;
while(T--){
char a,b;
cin >> a >> b;
cout << (a - 'a') * 25 + b - 'a' + (a > b ? 1 : 0) << endl;
}
return 0;
}

浙公网安备 33010602011771号