C/C++描述 第十一届蓝桥杯省赛 第一场(2020.7.5) 试题 I: 字符串编码 题目+题解

第十一届蓝桥杯省赛C/C++大学B组 第一场

  大家好,我叫亓官劼(qí guān jié ),在CSDN中记录学习的点滴历程,时光荏苒,未来可期,加油~博客地址为:亓官劼的博客

本文原创为亓官劼,请大家支持原创,部分平台一直在盗取博主的文章!!!

博主目前仅在CSDN中写博客,唯一博客更新的地址为:亓官劼的博客


在这里插入图片描述

试题 I: 字符串编码

时间限制: 1.0s 内存限制: 512.0MB 本题总分:25 分

【问题描述】

小明发明了一种给由全大写字母组成的字符串编码的方法。对于每一个大

写字母,小明将它转换成它在 26 个英文字母中序号,即 A → 1, B → 2, … Z →

26。

这样一个字符串就能被转化成一个数字序列:

比如 ABCXYZ → 123242526。

现在给定一个转换后的数字序列,小明想还原出原本的字符串。当然这样

的还原有可能存在多个符合条件的字符串。小明希望找出其中字典序最大的字

符串。

【输入格式】

一个数字序列。

【输出格式】

一个只包含大写字母的字符串,代表答案

【样例输入】

123242526

【样例输出】

LCXYZ

【评测用例规模与约定】

对于 20% 的评测用例,输入的长度不超过 20。

对于所有评测用例,输入的长度不超过 200000。

试题I 题解

#include <iostream>
#include <vector>
using namespace std;
int main(){
    string in ;
    cin>>in;
    int len = in.length();
    string re = "";
    int flag_1;//第一位为1
    int flag_2;//第一位为2
    flag_1 = flag_2 = 0;
    for(int i = 0;i < len;i++){
        if(flag_1){
            int mid = int(in[i-1]-'0')*10+int(in[i]-'0');
            re += char(mid+'A'-1);
            flag_1 = 0;
            continue;
        }
        if(flag_2){
            if(in[i]<='6'){
                int mid = int(in[i-1]-'0')*10+int(in[i]-'0');
                re += char(mid+'A'-1);
                flag_2 = 0;
            } else{
                re += char(in[i-1] - '0' +'A'-1);
                re += char(in[i] - '0' +'A'-1);
                flag_2 = 0;
            }
            continue;
        }
        if(in[i] >= '3')
            re += char(in[i] - '0' + 'A' - 1);
        if(in[i] == '1' ){
            if(i+2<=len-1 && in[i] == '0'){
                re += char(in[i] - '0' + 'A' - 1);
                continue;
            }
            flag_1 = 1;
        }
        if(in[i] == '2'){
            if(i+2<=len-1 && in[i] == '0'){
                re += char(in[i] - '0' + 'A' - 1);
                continue;
            }
            flag_2 = 1;
        }
    }
    cout<<re;
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_43422111/article/details/107161967