#include <iostream> #include <map> #include <string> using namespace std; map < string, char > tbl; void init() { tbl["123457"] = 'A'; tbl["1234567"] = 'B'; tbl["456"] = 'C'; tbl["1580"] = 'D'; tbl["12456"] = 'E'; tbl["1249"] = 'F'; tbl["12569"] = 'G'; tbl["13457"] = 'H'; tbl["37"] = 'I'; tbl["3567"] = 'J'; tbl["13459"] = 'K'; tbl["156"] = 'L'; tbl["12357"] = 'M'; tbl["3579"] = 'N'; tbl["123567"] = 'O'; tbl["1458"] = 'P'; tbl["12347"] = 'Q'; tbl["123459"] = 'R'; tbl["12467"] = 'S'; tbl["278"] = 'T'; tbl["13567"] = 'U'; tbl["1379"] = 'V'; tbl["135790"] = 'W'; tbl["90"] = 'X'; tbl["1347"] = 'Y';tbl["23456"] = 'Z'; } int main() { init(); string s; while (getline(cin,s)) { for (int i = 0; i < s.size(); i++) { if (isalpha(s[i])) cout << s[i]; else if (s[i] == '0' || s[i] == ' ') cout << " "; else { string tmp; do { tmp += s[i]; if (tbl.count(tmp)) break; i++; } while (!isalpha(s[i]) && i < s.size()); cout << tbl[tmp]; if (isalpha(s[i])) cout << s[i]; } } cout << endl; } return 0; }
2021年2月21日 星期日
a631: 11. LED Decoder
2021年2月19日 星期五
e907: 108 p9. 二進位制密碼驗證
解題心得
s.find() 若找不到子字串,回傳string::npos。
程式碼
#include <iostream> #include <vector> using namespace std; vector<int> result; void check(string s) { int zero = 0, one = 0; for (int i = 0; i < s.size(); i++) { if (s[i] != '0' && s[i] != '1') { result.push_back(1); break; } } if (s.size() < 8 || s.size() > 12) result.push_back(2); for (int i = 0; i < s.size(); i++) { if (s[i] == '0') zero++; else if (s[i] == '1') one++; } if (zero < 2) result.push_back(3); if (one < 3) result.push_back(4); if (s.find("101") == string::npos) result.push_back(5); } int main() { string password; cin >> password; check(password); if (result.size() == 0) cout << 0; else { for (int i = 0; i < result.size(); i++) { if (i == 0) cout << result[i]; else cout << " " << result[i]; } } return 0; }
e925: pD. 學號檢查
程式碼
#include <iostream> #include <vector> using namespace std; vector<string> code; bool isValid(string ID) { if (ID[0] != 'B') return false; if (!isdigit(ID[1]) || !isdigit(ID[2])) return false; if (!isdigit(ID[7]) || !isdigit(ID[8])) return false; string s = ID.substr(3, 4); for (int i = 0; i < code.size(); i++) { if (s == code[i]) return true; } return false; } int main() { int n, invalid = 0; cin >> n; string ID; while (n--) { string s; cin >> s; code.push_back(s); } for (int i = 0; i < 10; i++) { cin >> ID; if (isValid(ID)) cout << "Y" << endl; else cout << "N" << endl, invalid++; } cout << invalid / 10.0; return 0; }
d732: 二分搜尋法
程式碼
#include <iostream> using namespace std; int search(int arr[], int len, int x) { int left = 0, right = len - 1, mid = (left + right) / 2; while (1) { if (arr[mid] == x) return mid + 1; if (mid < 0 || mid >= len || left >= right) return 0; if (arr[mid] > x) right = mid - 1; else left = mid + 1; mid = (right + left) / 2; } } int main() { std::ios::sync_with_stdio(false); std::cin.tie(0); int n, k, x; cin >> n >> k; int* arr = new int[n]; for (int i = 0; i < n; i++) cin >> arr[i]; for (int i = 0; i < k; i++) { cin >> x; cout << search(arr, n, x) << endl; } return 0; }
e788: b3.畢業典禮(Ceremony)
解題心得:
cmp的部分要注意一下。
程式碼:
#include <iostream> #include <algorithm> using namespace std; struct Student { int order; string ID, name; }; bool cmp(Student a, Student b) { if (a.ID[8] != b.ID[8]) return a.ID[8] < b.ID[8]; else if (a.ID[0] != b.ID[0]) return a.ID[0] < b.ID[0]; else return a.order<b.order; } int main() { int n; cin >> n; Student* list = new Student[n]; for (int i = 0; i < n; i++) { cin >> list[i].ID >> list[i].name; list[i].order = i; } sort(list, list + n, cmp); for (int i = 0; i < n; i++) cout << list[i].ID[8] << ": " << list[i].name << endl; return 0; }
2021年2月17日 星期三
Q1--Library Database 解題筆記
題目簡介
請根據使用者輸入的命令,模擬圖書資料庫,並做出相對應的操作。
指令如下:
(1) Insert: Insert "title" "author" "edition"
(2) Delete Edition: Delete Edition "title" "author" "edition"
(3) Delete Book: Delete Book "title" "author"
(4) Find Book: Find Book "title" "author"
(5) Find Author: Find Author "author"
(6) Sort by Title: Sort by "title"
(7) Sort by Author: Sort by "author"
解題筆記
一、取得指令方法
輸入指令可大致分為兩部分,一部份是「什麼指令」,另一部份是「資訊」。
問題是指令沒辦法單純以空白切割,也不一定是一個字。
方法: 使用getline()分割字串。
string cmd;
while (getline(cin, cmd))
{
stringstream ss(cmd);
getline(ss, cmd, '\"');
// ......
}
如此一來,就能取得「命令」的部分,即cmd。
如此一來,就能取得「命令」的部分,即cmd。
二、解析指令的方法
方法: cmd.substr(pos, n) == 字串,pos為字串比對起始點,n為長度。
如此可在不破壞字串的情況下得到資訊。
三、 map, pair, set, typedef 的細節
解題結構如下:
typedef pair<string, string> B_Info; // title, author
typedef map<B_Info, set<int>> Books;
Books database;
如此一來,就能使用pair, map, set的特性快速存取、修改。
map 跟 set 都有count(),用來檢查有沒有某個資料。
typedef pair<string, string> B_Info 的意思是把 pair<string, string> 叫做 B_Info,這樣後面就不用每次都打 pair<string, string>,比較易讀也節省時間。
四、遍歷資料的細節
像是在輸出 edition 時,是用 set iterator 跑的。那要如何指定說像是: 第一個或最後一個資料輸出長的不一樣呢?
沒辦法像一般可以:
for(int i=0; i< m.size();i++)
{
if(i==m.size()-1) // do something.....
}
但可以:
if(it==m.begin()) {}
五、 sort map
如果想把 map 依照指定順序排列該怎麼做?
struct cmpByStringLength {
bool operator()(const std::string& a, const std::string& b) const {
return a.length() < b.length();
}
};
// ...
std::map<std::string, std::string, cmpByStringLength> myMap;
心得
在「預期解題時間」一欄,助教寫了35分鐘。我真心好奇助教是如何計算時間的,感覺光是照著最後寫出來的code打也要半個小時左右,考場上不能查資料、重無到有寫出來,大一學生總得要一個多小時吧。(還是我程度太差?)
2021年2月10日 星期三
d566: 秒殺率
解題心得:
此處的解題紀錄"排在前面"的資料代表時間"越晚"
程式碼:
#include <iostream> #include <vector> using namespace std; struct user { string name, status, first_status; }; int main() { int n, ac = 0, totalAC = 0; vector<user> database; std::ios::sync_with_stdio(false); std::cin.tie(0); cin >> n; while (n--) { bool isExist = false; string n_tmp, s_tmp; cin >> n_tmp >> s_tmp; for (int i = 0; i < database.size(); i++) { if (database[i].name == n_tmp) { isExist = true; database[i].first_status = s_tmp; if(s_tmp=="AC") database[i].status = s_tmp; break; } } if (!isExist) { user tmp; tmp.name = n_tmp; tmp.status = tmp.first_status = s_tmp; database.push_back(tmp); } } for (int i = 0; i < database.size(); i++) { if (database[i].status == "AC") totalAC++; if (database[i].first_status == "AC") ac++; } cout << (double)ac / totalAC * 100 << "%" << endl; return 0; }
2021年2月9日 星期二
f634: 士兵歸來
解題心得:
https://codist.me/zh/blog/stl-set/
程式碼:
#include <iostream> #include <set> #include <iomanip> using namespace std; struct soldier { string name; int type, rank; bool operator<(const soldier &right) const { if (name != right.name) return name < right.name; else { if (type != right.type) return type < right.type; else return rank < right.rank; } } }; int main() { std::ios::sync_with_stdio(false); std::cin.tie(0); int n, m; cin >> n >> m; set<soldier> legion; while (m--) { soldier tmp; cin >> tmp.name >> tmp.type >> tmp.rank; legion.insert(tmp); } int navy = 0, army = 0, air = 0, officer = 0, sergeant = 0, soldier = 0; for (auto it = legion.begin(); it != legion.end(); it++) { if ((*it).type == 1) navy++; if ((*it).type == 2) army++; if ((*it).type == 3) air++; if ((*it).rank == 1) officer++; if ((*it).rank == 2) sergeant++; if ((*it).rank == 3) soldier++; } cout << "navy:" << navy << " army:" << army << " air:" << air << endl; cout << "officer:" << officer << " sergeant:" << sergeant << " soldier:" << soldier << endl; cout << fixed << setprecision(1) << "survival rate: " << (double)legion.size() / n * 100 << "%"; return 0; }
2021年2月2日 星期二
在windows上使用opencc的方法
1. 從github下載專案並解壓縮
2. 用cmd切到專案資料夾的bin目錄下,同時把欲轉換的檔案也放入該目錄下
3. 輸入: opencc -i input.txt -o output.txt -c C:\Users\xxxxx\oooo\build\share\opencc\s2tw.json
-c 後面接指定的json檔路徑,至於哪個json檔依需求選擇。
-i 與 -o 後面接的檔案名稱好像需要為英文或繁中,簡中可能會讀不到
4. 沒有錯誤訊息就成功!輸出檔會生成在同一個目錄底下。
f266: Hello, Echo (Part 1)
程式碼:
#include <iostream> #include <string> using namespace std; int main() { string s[5]; for (int i = 0; i < 5; i++) cin >> s[i]; for (int i = 0; i < 5; i++) { for (int j = i; j < 5; j++) cout << s[j] << " "; cout << endl; } return 0; }
訂閱:
文章 (Atom)