1 c039 // P01 3N+1問題 #include <iostream> #include <algorithm> using namespace std; int main() { int i, j; while(cin >>i >>j){ int m = min(i, j);int M = max(i,j);int cycle = 0; for (int k = m; k <= M; k++){ int n= k;int t =0;while (1){ t++; if (n ==1) break; if(n%2) n=3*n+1; else n=n/2; } cycle = max(cycle, t); } cout <<i<<" "<< j <<" "<< cycle << endl; } return 0; } 2 c007 //PO2TEX的引號 #include <iostream> using namespace std; int main(){ char c; bool flag = true; while (cin.get(c)){ if(c =='"'){ cout << (flag ? "``" : "''"); flag = !flag; } else cout << c; } return 0; } 3 c054 // P03 WERTYU #include <iostream> using namespace std;//查韵表七宣告 string t ="`1234567890-=QWERTYUIOP[]\\ASDFGHJKL;'ZXCVBNM,./"; int main(){ char c; while (cin.get(c)){ if (c ==' '|| c=='\n') cout << c; else { int p=t.find(c); cout << t[p -1]; } } return 0; } 4 e543 //PO4 迴文與鏡像詞 #include <iostream> #include <algorithm> #include <string> #define ALL(x) x.begin(), x.end() using namespace std; string nt = "ABCDEFGHIJKLMNOPQRSTUVWXYZ123456789"; string mt = "A 3 HIL JM O 2TUVWXY51SE Z 8 "; bool isP(string s); bool isM(string s); int main(){ string s; while (cin >>s){ bool p = isP(s); bool m = isM(s); cout <<s<<" -- is "; if (p && m) cout << "a mirrored palindrome."; else if (p) cout << "a regular palindrome."; else if (m) cout << "a mirrored string."; else cout << "not a palindrome."; cout <<"\n\n"; } return 0; } bool isP(string s) { string rs = s; reverse(ALL(rs)); return rs == s; } bool isM(string s){ string rs = s; reverse(ALL(rs)); for (int i =0; i< s.size();i++){ int p= nt.find(rs[i]); rs[i] = mt[p]; } return rs == s; } 5 d132 // PO5 猜數字遊戲 #include <iostream> #include <vector> #include <algorithm> using namespace std; int main(){ int game = 0; int n; while (cin >>n && n != 0) { printf("Game %d:\n",++game); vector<int> s(n); for (int i=0; i < n; i++) cin >>s[i]; vector<int>g(n); while (true){ //讀猜題順便检查A int A=0,B=0,z=0; for (int i = 0; i <n; i++) { cin >>g[i]; if (s[i] == g[i]) A++; if (g[i] == 0) z++; // 检查 日的數量是否達到n } if (z == n) break; //检查 B:先检查出题&猜题1-9出現次数,再扣除A for (int d = 1; d <= 9; d++) { int sc = 0, gc = 0; for (int i = 0; i<n; i++){ if (s[i] ==d) sc++; if (g[i]== d) gc++; } B=B+ min(sc, gc); } B=B-A; printf(" (%d,%d)\n",A,B); } } return 0; } 6 e558 //p06 #include <iostream> using namespace std; #define SIZE 100001 int counts[SIZE]; void Initialize() { int sum; for (int i = SIZE - 1, j; i; --i) { j = i, sum = i; while (j) sum += j % 10, j /= 10; if (sum < SIZE) counts[sum] = i; } } int main() { cin.sync_with_stdio(false), cin.tie(nullptr); int times, number; Initialize(); cin >> times; while (times--) cin >> number, cout << counts[number] << '\n'; } 7 b123 //p07 #include <iostream> #include <algorithm> #include <cstring> using namespace std; int main() { cin.sync_with_stdio(false); cin.tie(nullptr); int rows, columns, pointer, maximum, area, index; int counts[101][101] = {}, xs[101], ys[101]; while (cin >> rows >> columns) { for (int i = 1; i <= rows; ++i) for (int j = 1; j <= columns; ++j) { cin >> counts[i][j]; if (counts[i][j]) counts[i][j] += counts[i - 1][j]; } maximum = pointer = 0; for (int i = rows; i >= 1; --i) { for (int j = 1; j <= columns; ++j) { index = j; while (pointer && counts[i][j] < ys[pointer - 1]) { --pointer; area = (j - xs[pointer]) * ys[pointer]; maximum = max(maximum, area); index = xs[pointer]; } if (!pointer || counts[i][j] > ys[pointer - 1]) xs[pointer] = index, ys[pointer] = counts[i][j], ++pointer; } while (pointer) { --pointer; area = (columns - xs[pointer] + 1) * ys[pointer]; maximum = max(maximum, area); } } cout << maximum << '\n'; } } 8 j121 //P08 #include <iostream> using namespace std; int a[26], b[26], n[105], m[105], l; string s1, s2; int main() { while (cin >> s1 >> s2){ l = s1.length(); for (int i = 0; i < 26; i++){ a[i] = 0; b[i] = 0; } for (int i = 0; i < l; i++){ a[s1[i]-'A']++; b[s2[i]-'A']++; n[i] = 0; m[i] = 0; } for (int i = 0; i < 26; i++){ n[a[i]]++; m[b[i]]++; } bool flag = true; for (int i = 0; i < l; i++){ if (n[i] != m[i]){ flag = false; break; } } if (flag) cout << "YES\n"; else cout << "NO\n"; } } 9 e541 // Pe9 大理石在哪裡 #include <iostream> #include <vector> #include <algorithm> #define ALL(x)x.begin(),x.end() using namespace std; int main() { int kase = 0; int N, Q; while (cin >> N >> Q && N !=0) { printf("CASE# %d:\n",++kase); //讀大理石並升幂排列 vector<int> v(N); for (int n = 0; n < N; n++) cin >>v[n]; sort(ALL(v)); //回答Q個問題 while (Q--) { int f; cin >>f; // lower_bound輸出為指操·减去v.begin()位址轉為int int p = lower_bound(ALL(v),f) - v.begin(); if (p<N && v[p] ==f) printf("%d found at %d\n",f,(p +1)); else printf("%d not found\n",f); } } return 0; } 10 c073 #include <iostream> #include <vector> using namespace std; void find_block(int a, int &pa, int &ha); void clear_above(int p, int h); void pipe_over(int p0, int h0, int p1); void show(void); int n; vector<int> pipe[25]; int main(void){ int i; string s1, s2; int a, b; int pa, pb; int ha, hb; ios::sync_with_stdio(0); cin.tie(0); while(cin >> n){ for(i=0; i<n; i++){ pipe[i].clear(); pipe[i].push_back(i); } while(1){ cin >> s1; if(s1 == "quit") break; cin >> a >> s2 >> b; find_block(a, pa, ha); find_block(b, pb, hb); if(pa == pb) continue; if(s1 == "move") clear_above(pa, ha); if(s2 == "onto") clear_above(pb, hb); pipe_over(pa, ha, pb); } show(); } return 0; } void find_block(int a, int &p, int &h){ for(p=0; p<n; p++){ for(h=0; h<pipe[p].size(); h++){ if(pipe[p][h] == a) return; } } } void clear_above(int p, int h){ for(int i=pipe[p].size()-1; i>h; i--){ pipe[pipe[p][i]].push_back(pipe[p][i]); pipe[p].pop_back(); } } void pipe_over(int p0, int h0, int p1){ pipe[p1].insert(pipe[p1].end(), pipe[p0].begin()+h0, pipe[p0].end()); pipe[p0].erase(pipe[p0].begin()+h0, pipe[p0].end()); } void show(void){ int i, j; for(i=0; i<n; i++){ cout << i << ":"; for(j=0; j<pipe[i].size(); j++){ cout << " " << pipe[i][j]; } cout << '\n'; } } 11 e155 // P11丢掉卡片 #include <iostream> #include <queue> using namespace std; int main() { int n; bool first; while (cin >>n && n !=0){ queue<int> q; for (int i =1; i <= n; i++)q.push(i); cout << "Discarded cards: "; first = true; while(q.size()>= 2){ //丢掉最上面的那張牌 if (first) first = false; else cout <<", "; cout << q.front();q.pop(); //把目前最上面的牌放到牌堆最下面 q.push(q.front());q.pop(); } cout << endl; cout << "Remaining card: "<< q.front()<< endl; } return 0; } 12 f166 //P12傅送點 #include <iostream> #include <queue> using namespace std; int S[1000000];//傳送點記錄矩陣 int dis[1000000];//移動記錄 int main(){ int n,P,L, R; queue<int> q; int s, sL, sR; //輸入傳送座標 cin >>n >>P>>L >>R; for (int i =0; i<n; i++) cin >>S[i]; q.push(0);//加入起始位置(座標0) while (true) { if(q.empty()){ cout << -1; break; } s = q.front();q.pop(); if(s == P){ cout << dis[s]; break; } // 检查當下位置是否為目的地 sL=s-L; if (sL >= 0) { sL = S[sL]; if (sL >= 0 && sL < n && dis[sL] == 0) { dis[sL] = dis[s] + 1; q.push(sL); } } sR = s + R ; if (sR < n){ sR = S[sR]; if (sR >= 0 && sR < n && dis[sR] == 0) { dis[sR] = dis[s] + 1; q.push(sR); } } } return 0; } 13 b838 #include <iostream> #include <stack> #include <string> using namespace std; int main() { int t; cin >>t;//讀取問題數量 while (t--){ string s; cin >> s; stack<char> up;// 储存上引號出現次數的容器 bool valid = true;//检验括號组合是否還有效 int ans = 0; for (auto c :s) { if (c == '(')up.push('('); //讀取到( else{ if (!up.empty()&& up.top() == '('){ ans++; up.pop(); } else{ //检查容器並計算合理括號 valid = false; break; } } } if (!up.empty())valid =false; cout << (valid ? ans : 0)<< endl; } return 0; } 14 h028 #include <iostream> #include <stack> #include <algorithm> #include <climits> using namespace std; pair<int, int> T[100002];// 1st 存座標 2nd 存橱高 TC188082]右侧强多地 int main(){ int N, L; int total = 0, height = 0; stack<pair<int, int>> s;// cin >>N >> L; //開始繪製林場:左端標記 T[0].first =0; //讀取 樹木数量和林場最右邊單位座標 T[0].second = INT_MAX; for (int i = 1 ; i <= N; i++)cin >> T[i].first; for (int i = 1 ; i <= N; i++)cin >> T[i].second; // 右端標記 T[N + 1].first = L; s.push(T[0]); for (int i =1; i <= N; i++) { // 检查往左右砍 bool left = T[i].first - T[i].second >= s.top().first; bool right = T[i].first + T[i].second <= T[i + 1].first; if (left || right){ total++; height = max(height,T[i].second);//更新砍倒最高樹木 while (s.top().first + s.top().second <= T[i +1].first) { // 检查前一棵樹往右砍是否不會壓到1+ 1的樹 total++; height = max(height,s.top().second); s.pop();//前面樹木倒下 } } else{ s.push(T[i]); } } cout << total << endl << height; return 0; } 15 d217 #include <iostream> #include <string> #include <set> using namespace std; #define ALL(x)x.begin(),x.end() int main() { int round; while (cin >> round && round != -1){ string s,g; int lc = 7; cin >>s >>g; // 敗北條件 lc: loss condition printf("Round %d\n",round); // 删除重複字元(題目)uc:unique characten set<char> uc(ALL(s)); set<char> ag; for (int i = 0; i<g.size(); i++){ if (ag.count(g[i])) continue; ag.insert(g[i]); if (uc.count(g[i])) uc.erase(g[i]); else lc--; //没有則畫一筆 // !lc:lc為0時成立 | uc.empty():題目被猜完 if (!lc || uc.empty()) break; } if (uc.empty()) cout << "You win.\n"; else if (!lc) cout << "You lose.\n"; else cout << "You chickened out.\n"; } return 0; } 16 f698 //P16 後序運算式 #include <iostream> #include <string> #include <stack> using namespace std; int main(){ // 運算符號 string ops ="+-*/"; // 數字記錄(stack) stack<int> num; // 讀取資料 string s; while(cin >>s){ int op = ops.find(s); if(op ==-1) num.push(stoi(s));//否則將資料轉數字储存 else {//讀到運算就彈出2數字開始計算 int n2 = num.top(); num.pop(); int n1 = num.top(); num.pop(); switch (op){ case 0: num.push(n1 + n2); break; case 1: num.push(n1 - n2); break; case 2: num.push(n1 *n2); break; default: num.push(n1 /n2); } } } cout << num.top(); return 0; } 17 d244 // P17 一堆石頭 #include <iostream> #include <map> using namespace std; int main(){ map<int,int>st;// map<石頭编號(索引值),個數(储存值)> int n; //讀取所有存在石頭的編號與個數 while (cin >>n) st[n]++; // 找尋不足 3颗的石頭 for (auto p :st) { //餘數為日代表刚好 3颗·日為FALSE 故不印出任何资訊 if(p.second % 3){ cout << p.first;break; } } return 0; } 18 e564 //P18團體佇列 #include <iostream> #include <string> #include <map> #include <queue> using namespace std; int main(){ int t,n,x; int t0; int kase = 0; // t:團隊數量;n:團隊成員數;×:成員编號; //處理當下成員的團隊编號 while (cin >>t && t){ //團隊數量日為結束程式 // map<成員(索引值),所屬團隊(储存值)>; map<int, int> team; for (int i = 0; i<t; i++){ cin >>n; while (n--){ cin >>x; team[x] = i; //給予成員團隊的編號 } } queue<int> tQueue;// tQueue:正在排隊隊伍的團隊編號 queue<int> eQueue[1000]; // eQueue[i]:正在排隊隊伍的團隊成員 printf("Scenario #%d\n",++kase); string cmd; while (cin >> cmd && cmd != "STOP" ){//字串STOP為停止處理命令 if (cmd =="ENQUEUE"){ // ENQUEUE:加入排隊隊伍 cin >> x; t0 = team[x];// 取得進入排隊成員的 團隊編號 if (eQueue[t0].empty())//成員 團隊编號 不在排隊隊伍時 tQueue.push(t0); eQueue[t0].push(x);// 團隊編號 加入排隊隊伍 } else {// 成員編號 加入排隊隊伍 t0 = tQueue.front();// DEQUEUE:離開排隊隊伍 // 取得即將離隊成員的 團隊編號 cout << eQueue[t0].front()<<"\n"; eQueue[t0].pop(); if (eQueue[t0].empty()) tQueue.pop(); } } cout <<"\n"; } return 0; } 19 e548 #include <iostream> #include <stack> #include <queue> using namespace std; int main(){ int n; while (cin >>n){ // ans[ol; stack; ans[1]: queue;,ans[2]: pq bool ans[] = { true, true, true }; stack <int> s; queue <int> q; priority_queue<int> pq; while (n--){ // t==1:input; t==2:output; int t, x; cin >> t>>x; if (t==1){ s.push(x); q.push(x); pq.push(x); } else { if (ans[0]){ if (!s.empty()&& x== s.top())s.pop(); else ans[0]= false; } if (ans[1]){ if (!q.empty()&& x== q.front())q.pop(); else ans[1] = false; } if(ans[2]) { if (!pq.empty() && x == pq.top()) pq.pop(); else ans[2] = false; } } } if ( ans[0] && !ans[1] && !ans[2])// 100 cout << "stack\n"; else if (!ans[0] && ans[1] && !ans[2]) // 010 cout << "queue\n"; else if (!ans[0] && !ans[1] && ans[2]) // 001 cout << "priority queue\n"; else if (!ans[0] && !ans[1] && !ans[2]) // 000 cout <<"impossible\n"; else cout << "not sure\n"; } // 111 110 011 return 0; } 20 d221 // P20加媳 #include <iostream> #include <queue> using namespace std; int main(){ int N, d; // N:運算數字數量;d:運算數字 while (cin >>N && N){ // 讀取要運算數字※priority_queue 會自己排序 // priority_queue<變數類別模板,容器類別模板,比較器模板> // 比較器:預設 less<int>降幕排列;本題 greater<int>為升幂 priority_queue<int, vector<int>, greater<int>> pq; for (int i =0;i<N; i++){ cin >> d; pq.push(d); } // 運算處理 long long sum, cost = 0; while (pq.size()!= 1){ // 計算加總 sum = pq.top(); pq.pop(); sum = sum + pq.top(); pq.pop(); // 計算代價(cost) cost = cost + sum; pq.push(sum); } cout << cost <<"\n"; } return 0; } 21 h083 #include <iostream> #include <string> #include <algorithm> #include <vector> using namespace std; #define ALL(x)x.begin(),x.end() int main(){ // 讀取所有的籤 int m; vector<string> v; // 宣告籤筒 cin >>m; while(m--){ string s; cin >>s; v.push_back(s);// 放入籤筒 } sort(ALL(v)); //检查 聖篓的籤数(規则 1&2皆成立才會是聖篓) int ans = 0; for (auto s : v) { int len = s.size(); for (int i= 1; i <= len / 2;i++){ string sa = s.substr(0,i); string sc = s.substr(len - i,i); if (sa == sc) { string sb = s.substr(i, len - 2*i);//[B]段 if (binary_search(ALL(v),sb)) ans++; } } } cout << ans; return 0; } 22 f640 #include <iostream> #include <string> using namespace std; int func();//本题使用到的遞迴副程式 int main(){ cout << func()<<"\n"; return 0; } int func(){ string token; int x,y,z; cin >> token; // token =="f" if (token == "f"){ x= func(); return 2 * x-3; } if (token == "g"){ x = func(); y = func(); return 2*x+y-7; } if(token =="h"){ x = func(); y= func(); z = func(); return 3*x-2*y+ z; } return stoi(token); } 23 f637 // P23 DF-expression #include <iostream> #include <string> using namespace std; int decode(int n); // 遞迴用解碼副程式 string s; int p; int main(){ int n; cin >>s; cin >> n; p = -1;// 初始值設定為[-1]位置的字元為初始值 cout << decode(n)<< "\n"; return 0; } //解碼:0:白色;1:黑色;2:切成 4 等分; int decode(int n) { int black = 0; p++; if (s[p] =='0') black = 0; else if (s[p] =='1') black =n * n; else { for (int i = 0; i <= 3; i++) black = black + decode(n / 2); } return black; } 24 k733 //P24磁軌移動序列 #include <iostream> #include <string> using namespace std; long long loop(int &head, int &tail);//主要處理 string s0; int tape = 0; int main(){ int h, t;// head & tail long long walk= 0;//記錄移動距離 cin >> s0; walk = loop(h,t);//輪入列車命令 walk= walk + abs(h - 10); cout << walk; return 0; } long long loop(int &head, int &tail){ //遞迴副程式資料處理初始化 long long walk = 0, subwalk; int num,h, t; head = tail =-1; while (1){ //結束點1:tape ==s.size() if (tape == s0.size()) return walk; if (s0[tape] == 'T'){ // 取得列車起點位置 // 一般命令處理 num = stoi(s0.substr(tape + 1,2)); tape = tape + 3; if (tail ==-1) head = num; else walk = walk + abs(num - tail);//計算移動距離walk tail = num; } //最末端設為 num else if (s0[tape] =='L'){ //迴圈命令處理(開端) num = stoi(s0.substr(tape + 1,1)); tape = tape + 2; subwalk = loop(h, t); if (tail ==-1)//移動命令讀取指標 head = h;//透過遞迴處理 Lx...E else// 迴圈命令處理(末端) walk = walk + abs(h - tail); tail = t; // walk + subwalk*num 為LX...E的移動距離 // abs(t - h)*(num - 1)為 TxxE 回到 LxTxx時的移動距離 walk = walk + subwalk * num + abs(t - h) * (num - 1); } // Ex:L2T21T23E->21>23>21>23->移動距離6 else {// se[tape] == 'E tape++; //移動命令讀取指標 return walk; // 回傳 walk } } }