2019 團體程式設計天梯賽
今天模擬了一下2019年的GPLT,最後也打了個國三的分,主要是L1最後一道字串耗費了好多時間,string的一些函式使用不熟練,但做了後面的L2發現其實L2的後兩題甚至比這題還簡單許多(僅細節方面)所以以後儘量不要過於死磕那一兩個測試點的部分分,儘量多開題,多拿每個題的大部分測試分數。
L1 - 估值一億的AI核心程式碼
模擬題,但是涉及到了字串的替換操作。
逐個操作分析:
-
需求1:消除多餘的空格,這個我們可以用stringstream來解決,細節就是消除後我們拼接的時候仍可能會需要空格,所以我們需要判斷字母和數字的前面要補充一個空格用於拼接,可以用到函式isalnum(c)來判斷字元c是否是字母或者數字。
-
需求2:大寫變小寫,直接操作即可。
-
需求3:字元替換操作,可以用string的replace函式,str.replace(a,b,ss)將字串str的[a,a + b - 1]的字串替換為ss(即位置a後面包括自己的b個字元用於替換),也可以寫成str.replace(str.begin() + a,str.begin() + a + b,ss)。
但有個需要特別注意的地方,這裡提到了獨立,所以我們find到一個位置並不一定要替換,需要判斷一下這個字元是不是獨立的(即我們判斷這個串左側和右側是否是非數字或字母的,即標點符號或者為空格),還需要注意的是如果沒找到的話我們要設定一個額外的偏移量,避免死迴圈一直找這個不合法的位置,這裡用到了str.find(ss,pos)即從pos位置開始再去找ss這個串。
還有一個點就是我現在換出來"I can",後面如果找"I"的時候又會把這個位置換掉,所以我們要麼直接一遍輸出一替換(不採用一次性替換好,直接輸出答案),要麼就是先把"I can"寫成"A can",A這個位置隨便用一個大寫字母即可,因為通過操作2,大寫字母已經不存在了,不會影響答案。 -
需求4:同上,需要判斷獨立性。
-
需求5:直接換即可。
完成。至此能夠看到細節出現在替換後可能再次被替換需要變換一下,還有就是獨立性的這個判斷,不判斷的話是有一個點過不去的,所以天梯賽題目的特點就是題幹敘述的特殊性質一定是對應測試點的,一定要考慮
#include <bits/stdc++.h> using namespace std; int main() { // cout << (char)('A' + 32) << '\n'; int n; cin >> n; getchar(); while(n--) { string s; getline(cin,s); stringstream ins(s); string cur,rep; int cnt = 0; while(ins >> cur) { if(!cnt || !isalnum(cur[0])) rep += cur; else rep += " " + cur; cnt++; } int m = rep.size(); for(int i = 0;i < m;i ++) { if(rep[i] >= 'A' && rep[i] <= 'Z' && rep[i] != 'I') { rep[i] = (char)(rep[i] + 32); } } // cout << rep << "***\n"; int d = 0;//每次find的偏移量,要不會死迴圈的 while(rep.find("can you",d) != rep.npos) { int p = rep.find("can you",d); d = p + 1; if((p == 0 && !isalnum(rep[p + 7])) || (!isalnum(rep[p - 1]) && !isalnum(rep[p + 7]))) rep.replace(p,7,"A can");//用一個不會出現的字元先替代I 因為會涉及到 // I can 也是獨立的 I } d = 0; while(rep.find("could you",d) != rep.npos) { int p = rep.find("could you",d); d = p + 1; if((p == 0 && !isalnum(rep[p + 9])) || (!isalnum(rep[p - 1]) && !isalnum(rep[p + 9]))) rep.replace(p,9,"A could"); } d = 0; while(rep.find("I",d) != rep.npos) { int p = rep.find("I",d); d = p + 1; if(!isalnum(rep[p - 1]) && !isalnum(rep[p + 1])) rep.replace(p,1,"you"); } d = 0; while(rep.find("me",d) != rep.npos) { int p = rep.find("me",d); d = p + 1; if(!isalnum(rep[p - 1]) && !isalnum(rep[p + 2])) rep.replace(p,2,"you"); } while(rep.find("?") != rep.npos) { int p = rep.find("?"); rep.replace(p,1,"!"); } while(rep.find("A") != rep.npos) { int p = rep.find("A"); rep.replace(p,1,"I"); } cout << s << '\n'; cout << "AI: " << rep << '\n'; } return 0; }