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;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章