1 条题解

  • 0
    @ 2026-6-19 10:31:00

    📝 题目大意

    给定一个长度为 2626 的字符串 SS,它是大写字母 AZ 的一个排列,表示键盘上 2626 个键在一条数轴上的排列顺序。初始位置在 A 所在位置,需要依次按下 A, B, C, \dots, Z 所有键,移动到相邻键的距离为 11。求完成全部输入所需的最小总移动距离。

    💡 解题思路

    1. 题目分析:键盘是一维线性排列,移动距离就是两个键在 SS 中下标之差的绝对值。题目等价于:依次访问字符 AB、…、ZSS 中的位置,求相邻两次访问位置之差的绝对值之和。由于 SS 长度固定为 2626,数据量极小,O(26)O(26) 即可。

    2. 算法推导

      • 首先预处理每个字母在 SS 中出现的位置。用数组 a[0..25] 存储,其中 a[0] 表示 'A'SS 中的下标,a[1] 表示 'B' 的下标,以此类推。具体实现:遍历 SS,令 a[s[i] - 'A'] = i
      • 初始位置设为 w = a[0](即 'A' 的位置),总距离 ans = 0
      • 按字母顺序遍历 i = 025:每次累加当前所在位置 w 到目标位置 a[i] 的距离 abs(w - a[i]),然后将 w 更新为 a[i]
      • 注意当 i = 0 时,abs(w - a[0]) = abs(a[0] - a[0]) = 0,不会增加距离,与题意"初始移动距离为 00"一致。
      • 最终 ans 即为 i=024pos(ci)pos(ci+1)\sum_{i=0}^{24} |pos(c_i) - pos(c_{i+1})|,其中 cic_i 为字母表第 ii 个字母。
    3. 边界与细节

      • 保证 SSAZ 的排列,不会有缺失或重复字母。
      • 答案可能较大(如样例 22 输出 223223),需使用 int(最大不超过 25×25=62525 \times 25 = 625int 完全足够)。
      • 无需特殊处理任何边界情况。

    ⏱️ 复杂度分析

    • 时间复杂度:预处理一遍 SS 需要 O(26)O(26),遍历字母表计算距离需要 O(26)O(26),总时间复杂度 O(1)O(1)(或写作 O(N)O(N) 其中 N=26N=26)。
    • 空间复杂度:仅需一个长度为 2626 的数组 a 和若干变量,空间复杂度 O(1)O(1)

    💻 标准代码 (C++)

    #include<bits/stdc++.h>
    using namespace std;
    int a[30]; // a[i] 表示字母表中第 i 个字母(A=0, B=1, ...)在字符串 S 中的下标
    int main()
    {
    	ios::sync_with_stdio(0);
    	cin.tie(0);cout.tie(0);
    	string s;cin>>s;
    	// 预处理:记录每个字母在 S 中的位置
    	for(int i=0;i<26;i++)
    		a[s[i]-'A']=i; // 字母 s[i] 在位置 i
    	int w=a[0],ans=0; // w: 当前所在位置(初始为 'A' 的位置),ans: 累计移动距离
    	for(int i=0;i<26;i++)
    	{
    		ans+=abs(w-a[i]); // 从当前位置移动到目标字母 a[i] 的距离
    		w=a[i];           // 更新当前位置
    	}
    	cout<<ans;
    	return 0;
    }
    
    • 1

    信息

    ID
    825
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    (无)
    递交数
    1
    已通过
    1
    上传者