1 条题解
-
0
思路与算法
读入n后先消费该行换行,再逐行读入n个国家名,保存到string数组。使用sort按字符串字典序升序排序,依次每行输出一个名称。比较不擅自改变字母大小写,也不删除重复名称。
正确性说明
string的字典序先比较首个不同位置的字符,公共前缀完全相同时较短串在前,正是本题按字母顺序排序的比较规则。sort使任意前项不大于后项,并保持元素的多重集合,因此所有输入国家名都按要求排序输出,不遗漏或增加名称。
复杂度
令最大名称长度为L,读入和输出O(nL),排序做O(n log n)次比较,每次最坏O(L),总时间O(nL log(n+1))。保存名称O(nL),sort内部另需O(log n)栈空间。数组初始化O(n)包含在上述界内;n和L都不超过20。
易错点
这是字符串字典序,不按长度优先或反向排序。前缀短串在前。名称逐行输出,不合成一行。n=1无需改变;相同名称仍保留。本题未授权忽略大小写,不做大小写归一化。
参考代码(C++11)
#include <algorithm> #include <iostream> #include <string> #include <vector> using namespace std; int main() { int n; cin >> n; string line; getline(cin, line); vector<string> countries(n); for (string &s : countries) getline(cin, s); sort(countries.begin(), countries.end()); for (const string &s : countries) cout << s << '\n'; }
- 1