题解:洛谷 P1765 手机

【题目来源】

洛谷:P1765 手机 - 洛谷

【题目描述】

一般的手机的键盘是这样的:

image

要按出英文字母就必须要按数字键多下。例如要按出 \(x\) 就得按 \(9\) 两下,第一下会出 \(w\),而第二下会把 \(w\) 变成 \(x\)\(0\) 键按一下会出一个空格。

你的任务是读取若干句只包含英文小写字母和空格的句子,求出要在手机上打出这个句子至少需要按多少下键盘。

【输入】

一行句子,只包含英文小写字母和空格,且不超过 \(200\) 个字符。

【输出】

一行一个整数,表示按键盘的总次数。

【输入样例】

i have a dream

【输出样例】

23

【算法标签】

《洛谷 P1765 手机》 #模拟# #字符串# #枚举# #NOI导刊#

【代码详解】

#include <bits/stdc++.h>  // 包含标准库头文件(万能头文件)
using namespace std;      // 使用标准命名空间

int main()
{
    string s;            // 定义字符串:存储输入的字符串
    int ans = 0;         // 定义变量:存储最终按键次数总和
    int m[300];          // 定义数组:存储每个字符对应的按键次数
    int mark = 1;        // 定义变量:辅助赋值变量
  
    getline(cin, s);     // 读取整行输入(包含空格)
  
    // 初始化字母a-r的按键次数(循环1-3)
    for (int i = 'a'; i <= 'r'; i++) 
    {
        m[i] = mark;     // 赋值当前字母的按键次数
        mark++;          // 辅助变量递增
        if (mark == 4)   // 每3个字母循环一次
            mark = 1;
    }
  
    // 特殊处理字母s、z和空格
    m['s'] = 4;          // 字母s需要按4次
    m['z'] = 4;          // 字母z需要按4次
    m[' '] = 1;          // 空格需要按1次
  
    mark = 1;            // 重置辅助变量
    // 初始化字母t-y的按键次数(循环1-3)
    for (int i = 't'; i <= 'y'; i++) 
    {
        m[i] = mark;     // 赋值当前字母的按键次数
        mark++;          // 辅助变量递增
        if (mark == 4)   // 每3个字母循环一次
            mark = 1;
    }
  
    // 计算字符串中所有字符的按键次数总和
    for (int i = 0; i < s.length(); i++) 
    {
        ans += m[s[i]];  // 累加当前字符的按键次数
    }
  
    cout << ans;         // 输出总按键次数
  
    return 0;            // 程序正常结束
}

【运行结果】

i have a dream
23
posted @ 2026-02-16 16:05  团爸讲算法  阅读(1)  评论(0)    收藏  举报