#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)