日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

PAT甲级题目翻译+答案 AcWing(字符串处理)

發(fā)布時(shí)間:2025/3/19 编程问答 16 豆豆
生活随笔 收集整理的這篇文章主要介紹了 PAT甲级题目翻译+答案 AcWing(字符串处理) 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1001 A+B Format (20 分)

  • 題意 :將整數(shù)轉(zhuǎn)換成標(biāo)準(zhǔn)格式
  • 思路 :從后往前遍歷字符串進(jìn)行模擬,每三個(gè)數(shù)字加一個(gè)逗號,但不能是在最前面加逗號,也不能是加在負(fù)號后面
#include <iostream>using namespace std;int main() {int a, b;cin >> a >> b;string num = to_string(a + b);string ans = "";for (int i = num.size() - 1, j = 0; i >= 0; i -- ){ans = num[i] + ans;++ j;if (j % 3 == 0 && i && num[i - 1] != '-') ans = "," + ans;}cout << ans;return 0; }

1005 Spell It Right (20 分)

  • 題意 :得到輸入數(shù)的各位之和后按位輸出分別的英文
  • 語法 :行末無空格,可以先輸出第一位后,分別輸出一個(gè)空格加每一位
#include <iostream>using namespace std;string word[] = {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"};int main() {string n;cin >> n;int s = 0;for (auto c : n) s += c - '0';string str = to_string(s);cout << word[str[0] - '0'];for (int i = 1; i < str.size(); i ++ ) cout << ' ' << word[str[i] - '0'];return 0; }

1006 Sign In and Sign Out (25 分)

  • 題意 :在輸入的每個(gè)第二個(gè)字符串中找最小的,第三個(gè)找最大的,輸出它們分別對應(yīng)的第一個(gè)字符串
#include <iostream>using namespace std;int main() {string open_id, open_time;string close_id, close_time;int m;cin >> m;for (int i = 0; i < m; i ++ ){string id, in_time, out_time;cin >> id >> in_time >> out_time;// 更新if (!i || in_time < open_time){open_id = id;open_time = in_time;}if (!i || out_time > close_time){close_id = id;close_time = out_time;}}cout << open_id << ' ' << close_id;return 0; }

1016 Phone Bills (25 分)

題意 :

  • chronologically時(shí)間先后順序;alphabetical order字典序
  • 給出每個(gè)時(shí)間段內(nèi)每分鐘的話費(fèi),給出n條消息包含用戶名稱,月日時(shí)分,打開還是關(guān)閉狀態(tài)
  • 要求按字典序輸出所有用戶的賬單,賬單包含用戶名稱和發(fā)生的月份,再按時(shí)間先后順序分別輸出每一段話費(fèi)的起始時(shí)間和時(shí)長和價(jià)格,最后輸出總價(jià)格
  • 保證所有日期在同一個(gè)月內(nèi),且每個(gè)on對應(yīng)的off是輸入中的時(shí)間順序的下一個(gè)off,無視無法配對的
  • 注意給出時(shí)間段的價(jià)格是美分,而最后輸出是美元,除以100.0

思路 :

  • 將所有時(shí)間都轉(zhuǎn)換成這個(gè)月的分鐘數(shù),但輸出時(shí)還要輸出這種格式化的時(shí)間,所以原先格式化的時(shí)間也要存下來
  • 注意到如果每條通話記錄的話費(fèi)按照每一分鐘來算,時(shí)間復(fù)雜度非常高,500(人) * 31 * 1440 * 24,而且這道題時(shí)間限制是0.2秒。那么怎么優(yōu)化呢?注意到每次是算一個(gè)區(qū)間內(nèi)話費(fèi)是多少,因此可以用前綴和思路優(yōu)化,先預(yù)處理出1號0點(diǎn)0分到這個(gè)月中任何一個(gè)時(shí)刻的話費(fèi),每個(gè)月中有多少個(gè)不同是時(shí)間呢?31 * 1440,不是很大
  • 前綴和計(jì)算話費(fèi)時(shí),算的是i - 1時(shí)刻,% 1440表示在一個(gè)周期中是第幾分鐘,/ 60表示這是第幾個(gè)小時(shí)
  • sum[i]表示00:00?00:01,00:01?00:02,...,?00:i00:00-00:01,00:01-00:02,...,-00:i00:00?00:01,00:01?00:02,...,?00:i,所以利用前綴和時(shí)不用-1
  • 關(guān)于如何處理on和off關(guān)系,就是把它們?nèi)看嬖谝粋€(gè)容器中,然后按時(shí)間順序排序,如果第一個(gè)是on且它的下一個(gè)剛好是off,就是一對合法的時(shí)間
  • 需要記錄的是每個(gè)人名對應(yīng)的記錄結(jié)構(gòu)題,記錄結(jié)構(gòu)題中存對應(yīng)映射的時(shí)刻,狀態(tài),標(biāo)準(zhǔn)化時(shí)間

語法 :

  • 如何在字符串中格式化寫入信息,用sprintf
  • map遍歷天然就是字典序;且遍歷時(shí)可以加&,這樣就不會涉及到復(fù)制,會快一些
  • 給每個(gè)人對應(yīng)的時(shí)間排序時(shí),可以在結(jié)構(gòu)體中重載,外面只要直接sort即可
  • 把string輸出成char數(shù)組,用.c_str,可以返回這個(gè)string的char數(shù)組的指針
  • 注意在結(jié)構(gòu)體內(nèi)寫重載運(yùn)算符后面還有一個(gè)const


#include <iostream> #include <algorithm> #include <vector> #include <map> #include <cstring> using namespace std;#define pb push_back #define fi first #define se secondconst int N = 1010, M = 1440 * 31 + 10;int cost[24]; double sum[M];struct Record {int minutes;string state;string format_time;bool operator<(const Record &t) const{return minutes < t.minutes;} };map<string, vector<Record>> persons;int main() {for (int i = 0; i < 24; i ++ ) cin >> cost[i];for (int i = 1; i < M; i ++ ) sum[i] = sum[i - 1] + cost[(i - 1) % 1440 / 60] / 100.0;int n; cin >> n; // string name, state, format_time;char name[25], state[10], format_time[20];int month, day, hour, minute;for (int i = 0; i < n; i ++ ){scanf("%s %d:%d:%d:%d %s", name, &month, &day, &hour, &minute, state);int minutes = (day - 1) * 1440 + hour * 60 + minute;sprintf(format_time, "%02d:%02d:%02d", day, hour, minute);persons[name].pb({minutes, state, format_time});}for (auto &person : persons){auto name = person.fi;auto records = person.se;sort(records.begin(), records.end());double total = 0;for (int i = 0; i + 1 < records.size(); i ++ ){auto a = records[i], b = records[i + 1];if (a.state == "on-line" && b.state == "off-line"){if (!total) printf("%s %02d\n", name.c_str(), month);cout << a.format_time << ' ' << b.format_time << ' ';double c = sum[b.minutes] - sum[a.minutes];printf("%d $%.2lf\n", b.minutes - a.minutes, c);total += c;}}if (total) printf("Total amount: $%.2lf\n", total);} }

1017 Queueing at Bank (25 分)

題意 :

  • 給n個(gè)人到的時(shí)間和要占用的時(shí)間和m個(gè)窗口
  • 來早了的要排隊(duì)到開門,來晚了的不算入
  • 保證每個(gè)一個(gè)窗口可以被一個(gè)人占用超過1小時(shí)
  • 求平均等待時(shí)間

思路 :

  • 對于每個(gè)窗口我們只需要知道它是在什么時(shí)刻結(jié)束了上一個(gè)人的占用
  • 對于每個(gè)人要怎么安排呢?應(yīng)該是安排到最早結(jié)束的那個(gè)窗口,所以我們每次要在所有窗口中找到最小值,所以可以用優(yōu)先隊(duì)列
  • 注意service_time要和60取一個(gè)min

做法 :

  • 把每個(gè)人的到達(dá)時(shí)間和占用時(shí)間都用結(jié)構(gòu)體存下,因?yàn)檫€要根據(jù)到達(dá)時(shí)間遍歷,因此結(jié)構(gòu)體中重載運(yùn)算符
  • 把m個(gè)窗口安排好,時(shí)間都是8點(diǎn)
  • 遍歷每個(gè)人,如果來晚了,cointinue;找到當(dāng)前結(jié)束時(shí)間最早最小的窗口,這個(gè)人的開始占用時(shí)間就是到達(dá)時(shí)間和最小結(jié)束時(shí)間中的最大值,總等待時(shí)間累加開始時(shí)間和到達(dá)時(shí)間之差,總?cè)藬?shù)++,將新的結(jié)束時(shí)間再放入窗口中

語法 :

  • 小根堆的定義
#include <iostream> #include <algorithm> #include <queue>using namespace std;const int N = 1e4 + 10;int n, m;struct Person {int arrive_time;int service_time;bool operator< (const Person &t) const{return arrive_time < t.arrive_time;} }persons[N];int main() {scanf("%d%d", &n, &m);int hour, minute, second, service_time, arrive_time;for (int i = 0; i < n; i ++ ){scanf("%d:%d:%d %d", &hour, &minute, &second, &service_time);service_time = min(service_time, 60);arrive_time = hour * 3600 + minute * 60 + second;persons[i] = {arrive_time, service_time * 60};}sort(persons, persons + n);priority_queue<int, vector<int>, greater<int>> windows;for (int i = 0; i < m; i ++ ) windows.push(8 * 3600);int sum = 0, cnt = 0;for (int i = 0; i < n; i ++ ){auto person = persons[i];int w = windows.top();windows.pop();if (person.arrive_time > 17 * 3600) break;int start_time = max(w, person.arrive_time);sum += start_time - person.arrive_time;cnt ++ ;int end_time = start_time + person.service_time;windows.push(end_time);}printf("%.1lf\n", (double)sum / cnt / 60); }

1026 Table Tennis (30 分)

思路 :

  • 考慮每個(gè)人,首先分成是否是vip放在兩個(gè)優(yōu)先隊(duì)列內(nèi),重要的信息有 到達(dá)的時(shí)間(轉(zhuǎn)換成秒數(shù)),和玩的時(shí)間
  • 考慮每張桌子,首先分成是否是vip桌子放在兩個(gè)優(yōu)先隊(duì)列內(nèi),重要的信息有 編號,上一個(gè)人的結(jié)束時(shí)間

1035 Password (20 分)

  • 題意 :輸入的每行的第二個(gè)字符串中按照題意替換字符,并且記錄被替換過的這兩個(gè)字符串,按要求輸出
  • 思路 :數(shù)組記錄即可,因?yàn)槭前错樞蛞灰粚?yīng)的
  • 語法 :puts和printf在這種時(shí)候比較方便。
#include <iostream>using namespace std;const int N = 1010;string name[N], pwd[N];string change(string str) {string res;for (auto c : str)if (c == '1') res += '@';else if (c == '0') res += '%';else if (c == 'l') res += 'L';else if (c == 'O') res += 'o';else res += c;return res; }int main() {int n;cin >> n;int m = 0;for (int i = 0; i < n; i ++ ){string a, b;cin >> a >> b;string c = change(b);if (b != c) name[m] = a, pwd[m ++ ] = c;}if (!m){if (n == 1) puts("There is 1 account and no account is modified");else printf("There are %d accounts and no account is modified", n);}else{cout << m << endl;for (int i = 0; i < m; i ++ ) cout << name[i] << ' ' << pwd[i] << endl;}return 0; }

1036 Boys vs Girls (25 分)

題意 :

  • 找出男孩中分?jǐn)?shù)最高的和女孩中分?jǐn)?shù)最低的,分別輸出姓名以及分?jǐn)?shù)差

思路 :

  • 發(fā)現(xiàn)不需要把他們?nèi)看嫦聛砼判?#xff0c;直接輸入比較即可
  • 更新變量的條件有 1.比待更新變量更優(yōu);2.當(dāng)前待更新變量還沒有被賦值

語法 :

  • string.empty()表示這個(gè)字符串還沒有被賦值過
  • string.size()
#include <iostream> using namespace std;int main() {int n; cin >> n;string boy_name, boy_id;int boy_score;string girl_name, girl_id;int girl_score;string name, id, sex;int score;for (int i = 0; i < n; i ++ ){cin >> name >> sex >> id >> score;if (sex == "F"){if (girl_name.empty() || score > girl_score){girl_score = score;girl_name = name;girl_id = id;}}else{if (boy_name.empty() || score < boy_score){boy_score = score;boy_name = name;boy_id = id;}}}if (girl_name.empty()) puts("Absent");else cout << girl_name << ' ' << girl_id << endl;if (boy_name.empty()) puts("Absent");else cout << boy_name << ' ' << boy_id << endl;if (boy_name.empty() || girl_name.empty()) puts("NA");else cout << girl_score - boy_score << endl; }

1050 String Subtraction (20 分)

  • 題意 :給兩個(gè)字符串,在第一個(gè)字符串中將在第二個(gè)中出現(xiàn)過的字符全部刪除
  • 語法 :getlinegetlinegetline函數(shù)在iostreamiostreamiostream頭文件中;unordered_set的count函數(shù)和insert函數(shù)
#include <iostream> #include <unordered_set>using namespace std;int main() {string s1, s2;getline(cin, s1);getline(cin, s2);unordered_set<char> hash;for (auto c : s2) hash.insert(c);string res;for (auto c : s1)if (!hash.count(c))res += c;cout << res;return 0; }

1060 Are They Equal (25 分)

題意 :

  • 給定一個(gè)機(jī)器能夠保存的有效數(shù)字的位數(shù),以及兩個(gè)浮點(diǎn)數(shù),求輸出這兩個(gè)浮點(diǎn)數(shù)保留后的形式以及是否相等

思路 :

  • 數(shù)字不一定標(biāo)準(zhǔn),可能有前導(dǎo)零(以后這種格式轉(zhuǎn)換類問題最好不要信題目說給float?);題目中提到d[1]>0 unless the number is 0,意思是除了0需要特殊處理,否則刪去前導(dǎo)零
  • 如果數(shù)值是0,則指數(shù)規(guī)定為0
  • k就是原先小數(shù)點(diǎn)前有幾個(gè)有效數(shù)字的意思,所以我們當(dāng)然是去找’.’;這種表示方法(不是科學(xué)表示法)對小數(shù)點(diǎn)后的數(shù)字也可能用到,因此找到小數(shù)點(diǎn)位置后,后面的數(shù)字也可能要用到,就新建立一個(gè)字符串,是移除小數(shù)點(diǎn)的版本
  • 1.找到’.‘的位置,如果沒有就在最后加上,且是最后一位;2.新的字符串中去掉原先的’.’;3.移除前導(dǎo)零,同時(shí)k–(比如0.0123 * 10 ^ 5,變成0.123 * 10 ^ 4);4.如果移除后發(fā)現(xiàn)新字符串空了,說明原先全部是0,k=0;5.如果長度大于n,截?cái)?#xff0c;如果長度小于n,后面補(bǔ)零;6.返回

語法 :

  • string中find沒找到的話返回-1
  • substr只傳一個(gè)參數(shù),用來截?cái)?/li>
#include <iostream> using namespace std;string change(string a, int n) {int k = a.find('.');if (k == -1) a += '.', k = a.find('.');string s = a.substr(0, k) + a.substr(k + 1);while (s.size() && s[0] == '0') s = s.substr(1), k -- ;if (s.empty()) k = 0;if (s.size() > n) s = s.substr(0, n);else s += string(n - s.size(), '0');return "0." + s + "*10^" + to_string(k); }int main() {int n;string a, b;cin >> n >> a >> b;a = change(a, n);b = change(b, n);if (a == b) cout << "YES " << a;else cout << "NO " << a << ' ' << b; }

1061 Dating (20 分)

  • 題意 :captive letter大寫字母;case sensitive區(qū)分大小寫;common共同的
  • 題意 :先找到第一二個(gè)字符串中第一個(gè)一樣的且符合條件的大寫字母,然后是第二個(gè)一樣的且符合條件大寫字母,然后找第三四個(gè)字符串中第一個(gè)符合條件且一樣的字母
  • 思路 :要看清題目背后含義,字母范圍;在第一個(gè)和第二個(gè)的輸出中,如果寫在同一個(gè)循環(huán)里,第一個(gè)滿足后用了bool還不夠,還要加一個(gè)continue,否則直接進(jìn)入了第二個(gè)判斷條件,而采用標(biāo)準(zhǔn)寫法用兩個(gè)while就沒有這個(gè)問題;
  • 語法 :時(shí)間題常見用printf的%02d;printf選擇句式;ASCII碼中從小到大分別是,數(shù)字,大寫字母,小寫字母;或中的與不需要括號;a[k] - ‘A’ + 10
#include <iostream>using namespace std;int main() {string a, b, c, d;cin >> a >> b >> c >> d;int k = 0;while (true){if (a[k] == b[k] && 'A' <= a[k] && 'G' >= a[k]) break;k ++ ;}char weekdays[7][4] = {"MON", "TUE", "WED", "THU", "FRI", "SAT", "SUN"};printf("%s ", weekdays[a[k] - 'A']);k ++ ;while (true){if (a[k] == b[k] && (a[k] >= '0' && a[k] <= '9' || a[k] >= 'A' && a[k] <= 'N')) break;k ++ ;}printf("%02d:", a[k] <= '9' ? a[k] - '0' : a[k] - 'A' + 10);for (int i = 0;; i ++ )if (c[i] == d[i] && (c[i] >= 'a' && c[i] <= 'z' || c[i] >= 'A' && c[i] <= 'Z')){printf("%02d", i);break;}return 0; }

1073 Scientific Notation (20 分)

  • 題意 :科學(xué)計(jì)數(shù)法轉(zhuǎn)數(shù)字
  • 思路 :當(dāng)科學(xué)計(jì)數(shù)法系數(shù)>0時(shí),有可能不僅無法加零,還去不了小數(shù)點(diǎn);注意題目有個(gè)關(guān)鍵地方,無論這個(gè)數(shù)是正負(fù),第一位是符號位
  • 語法 :string的find函數(shù);substr若只有一個(gè)參數(shù),那個(gè)參數(shù)是pos,返回包含pos在內(nèi)后面的整個(gè)字符串;string函數(shù),先長度后內(nèi)容
#include <iostream>using namespace std;int main() {string s;cin >> s;if (s[0] == '-') cout << '-';int k = s.find('E');string a = s[1] + s.substr(3, k - 3);int b = stoi(s.substr(k + 1));if (b <= 0) cout << "0." << string(- b - 1, '0');else if (b < a.size() - 1) a = a.substr(0, b + 1) + '.' + a.substr(b + 1);else a += string(b - a.size() + 1, '0');cout << a;return 0; }

1077 Kuchiguse (20 分)

  • 題意 :給n個(gè)字符串,找這n個(gè)字符串最長的公共后綴(2<=N<=1002<=N<=1002<=N<=100maxlen<=256maxlen <= 256maxlen<=256
  • 語法 :與getline搭配使用getchar!reverse在algorithm中;substr只傳一個(gè)參數(shù)的妙用,后綴
#include <iostream>using namespace std;const int N = 110;string s[N];int main() {int n;cin >> n;getchar();for (int i = 0; i < n; i ++ ) getline(cin, s[i]);for (int k = s[0].size(); k; k -- ){string sf = s[0].substr(s[0].size() - k);bool is_matched = true;for (int i = 1; i < n; i ++ )if (s[i].size() < k || s[i].substr(s[i].size() - k) != sf){is_matched = false;break;}if (is_matched){cout << sf;return 0;}}cout << "nai";return 0; }

1082 Read Number in Chinese (25 分)

題意 :

1084 Broken Keyboard (20 分)

  • 題意 :The English letters must be capitalized英文字母必須大寫
  • 題意 :給兩個(gè)字符串,找第二個(gè)字符串中在第一個(gè)中沒有出現(xiàn)的字符,無視大小寫
  • 思路 :雙指針即可,b中有的a中一定有,反之不一定,且按順序,利用好這種性質(zhì),a為主指針,將b中與a一一比對;為了防止數(shù)組越界,要在b中最后加上一個(gè)a中沒有出現(xiàn)過的字符
  • 語法 :char = toupper(char);ASCII碼才127之間,且可以直接以char當(dāng)數(shù)組下標(biāo);讓一個(gè)數(shù)組全部都是某個(gè)具體數(shù)值的方法
#include <iostream>using namespace std;int main() {string a, b;cin >> a >> b;bool st[200] = {0};b += '#';for (int i = 0, j = 0; i < a.size(); i ++ ){char x = toupper(a[i]), y = toupper(b[j]);if (x == y) j ++ ;else{if (!st[x]) st[x] = true, cout << x;}}return 0; }

1108 Finding Average (20 分)

  • 題意 :number和numbers
  • 題意 :輸入n個(gè)字符串,判斷分別是否是合法數(shù)字(大小,小數(shù)點(diǎn)后位數(shù),無效字符)
  • 思路 :看小數(shù)點(diǎn)后是否合法時(shí),如果點(diǎn)在最后一位,num.size() - k就會是1,在倒數(shù)第二位,就會是2,倒數(shù)第三位等于3,在倒數(shù)第三位時(shí)后面有兩位有效數(shù)字,所以大于三,就多于兩位有效數(shù)字
  • 語法 :stof(float實(shí)數(shù))可以幫我們判斷輸入字符串是否合法,如果不合法會拋出異常,所以只要寫try,catch語句,如果是合法數(shù)字,再判斷是否在正負(fù)一千以內(nèi),小數(shù)點(diǎn)后是否最多兩位;但這個(gè)函數(shù)有一個(gè)問題5.2abc也被算作合法數(shù)字,它會看這個(gè)字符串的前幾位能否構(gòu)成合法實(shí)數(shù), 如果能,它就只用前幾位,所以這里還要判斷最終位數(shù)。size_t是記錄用了幾個(gè)字符,如果用的字符的數(shù)量小于num.size,說明就是5.2abc形式,也不是合法的;**catch(…)**表示接收任何類型的異常;string.findk!=-1就是存在小數(shù)點(diǎn);string.c_str();且以上這些不需要其它額外的頭文件
#include <iostream>using namespace std;int main() {int n;cin >> n;double sum = 0;int cnt = 0;while (n -- ){string num;cin >> num;double x;bool success = true;try{size_t idx;x = stof(num, &idx);if (idx < num.size()) success = false;}catch(...){success = false;}if (x < -1000 || x > 1000) success = false;int k = num.find('.');if (k != -1 && num.size() - k > 3) success = false;if (success) cnt ++ , sum += x;else printf("ERROR: %s is not a legal number\n", num.c_str());}if (cnt > 1) printf("The average of %d numbers is %.2lf", cnt, sum / cnt);else if (cnt == 1) printf("The average of 1 number is %.2lf", sum);else printf("The average of 0 numbers is Undefined");return 0; }

1124 Raffle for Weibo Followers (20 分)

  • 題意 :給n個(gè)字符串,輸出從開始位置每隔m個(gè)位置的字符串,要跳過已經(jīng)被輸出過的
  • 思路 :模擬就是從第一個(gè)開始的位置輸出,然后每次跳到n個(gè)位置后,如果跳到的位置已經(jīng)被輸出過,那就跳過;索性用數(shù)組記錄位置對應(yīng)的字符串,就不用for了;用set判斷是否已經(jīng)被輸出過以及有沒有輸出過字符串。
#include <iostream> #include <unordered_set>using namespace std;const int N = 1e3 + 10;string name[N];int main() {int m, n, s;cin >> m >> n >> s;unordered_set<string> se;for (int i = 1; i <= m; i ++ ) cin >> name[i];int k = s;while (k <= m){if (se.find(name[k]) != se.end()) k ++ ;else{cout << name[k] << endl;se.insert(name[k]);k += n;}}if (se.empty()) cout << "Keep going...";return 0; }

1141 PAT Ranking of Institutions (25 分)

語法 :

  • 注意本題的數(shù)據(jù)對精度的要求比PAT高;因?yàn)楸绢}中有除法,可能除不盡,由于我們算的不是總分/1.5,而是一個(gè)乙級讀進(jìn)來就/1.5,這樣精度會有一些欠缺
  • 本題對精度要求較高,為了避免出現(xiàn)真實(shí)的總分是124,但用浮點(diǎn)數(shù)存儲的是123.999999999的情況,建議在將整數(shù)取整之前加上eps,比如eps可以取 10?810^{-8}10?8
  • 將輸入的字符串轉(zhuǎn)小寫
#include <iostream> #include <cstring> #include <unordered_map> #include <vector> #include <algorithm>using namespace std;struct School {string name;int cnt;double sum;School(): cnt(0), sum(0) {}bool operator< (const School &t) const{if (sum != t.sum) return sum > t.sum;if (cnt != t.cnt) return cnt < t.cnt;return name < t.name;} };int main() {int n;cin >> n;unordered_map<string, School> hash;while (n -- ){string id, sch;double grade;cin >> id >> grade >> sch;for (auto& c : sch) c = tolower(c);if (id[0] == 'B') grade /= 1.5;else if (id[0] == 'T') grade *= 1.5;hash[sch].sum += grade;hash[sch].cnt ++ ;hash[sch].name = sch;}vector<School> schools;for (auto item : hash){item.second.sum = (int)(item.second.sum + 1e-8);schools.push_back(item.second);}sort(schools.begin(), schools.end());cout << schools.size() << endl;int rank = 1;for (int i = 0; i < schools.size(); i ++ ){auto s = schools[i];if (i && s.sum != schools[i - 1].sum) rank = i + 1;printf("%d %s %d %d\n", rank, s.name.c_str(), (int)s.sum, s.cnt);}return 0; }

1153 Decode Registration Card of PAT (25 分)

思路 :

  • 輸出按人數(shù)非遞增順序,格式為 考場編號 總?cè)藬?shù)。若人數(shù)并列則按考場編號遞增順序輸出。,因此for (auto item : hash) rooms.push_back({-item.second, item.first});,因此可以直接sort(rooms.begin(), rooms.end());,輸出的時(shí)候printf("%s %d\n", room.second.c_str(), -room.first);
#include <iostream> #include <cstring> #include <unordered_map> #include <algorithm> #include <vector>using namespace std;const int N = 10010;int n, m; struct Person {string id;int grade;bool operator< (const Person &t) const{if (grade != t.grade) return grade > t.grade;return id < t.id;} }p[N];int main() {cin >> n >> m;for (int i = 0; i < n; i ++ ) cin >> p[i].id >> p[i].grade;for (int k = 1; k <= m; k ++ ){string t, c;cin >> t >> c;printf("Case %d: %s %s\n", k, t.c_str(), c.c_str());if (t == "1"){vector<Person> persons;for (int i = 0; i < n; i ++ )if (p[i].id[0] == c[0])persons.push_back(p[i]);sort(persons.begin(), persons.end());if (persons.empty()) puts("NA");elsefor (auto person : persons) printf("%s %d\n", person.id.c_str(), person.grade);}else if (t == "2"){int cnt = 0, sum = 0;for (int i = 0; i < n; i ++ )if (p[i].id.substr(1, 3) == c){cnt ++ ;sum += p[i].grade;}if (!cnt) puts("NA");else printf("%d %d\n", cnt, sum);}else{unordered_map<string, int> hash;for (int i = 0; i < n; i ++ )if (p[i].id.substr(4, 6) == c)hash[p[i].id.substr(1, 3)] ++ ;vector<pair<int, string>> rooms;for (auto item : hash) rooms.push_back({-item.second, item.first});sort(rooms.begin(), rooms.end());if (rooms.empty()) puts("NA");elsefor (auto room : rooms)printf("%s %d\n", room.second.c_str(), -room.first);}}return 0; }

總結(jié)

以上是生活随笔為你收集整理的PAT甲级题目翻译+答案 AcWing(字符串处理)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。