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;
}
posted @ 2022-05-04 19:26  象征阳光  阅读(5)  评论(0)    收藏  举报  来源