第十一屆藍橋杯省賽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;
}