1.成绩排序(算法与仿函数)
题目描述
N个学生的数据,将学生数据按成绩升序排序,如果成绩相同则按姓名字典升序排序,如果姓名的字母序也相同则按照学生的年龄升序排序,并输出N个学生排序后的信息。
输入
测试数据有多组,直到输入结束
每组输入第一行有一个整数N(N<=1000),接下来的N行包括N个学生的数据。
每个学生的数据包括姓名(长度不超过100的字符串)、年龄(整形数)、成绩(小于等于100的正数)。
输出
输出排序后的学生信息,格式见样例。
样例输入
3
abc 20 99
bcd 19 97
bed 20 97
样例输出
bcd 19 97
bed 20 97
abc 20 99
题解
#include<bits/stdc++.h> using namespace std; struct stu { string name; int old, score; } s[1005]; int main() { int n; cin >> n; for (int i = 0; i < n; i++) { cin >> s[i].name >> s[i].old >> s[i].score; } sort(s, s + n, [](stu a, stu b) { if (a.score == b.score && a.name == b.name) return a.old < b.old; if (a.score == b.score) return a.name < b.name; return a.score < b.score; }); for (int i = 0; i < n; i++) { cout << s[i].name << " " << s[i].old << " " << s[i].score << endl; } }
2.筛选法求素数(算法)
题目描述
用埃拉托斯特尼筛法求num之内的素数就是依次把不大于num的平方根的所有素数的倍数剔除。也即首先从2开始,把2的倍数剔除,然后把下一个剩下的最小素数3的倍数剔除,依此类推直到不大于num的平方根,最后剩下的就都是素数。
用stl容器和remove_if算法实现筛选法求素数。
输入
测试次数
每组测试数据一行:正整数num(num>1)
输出
每组测试数据一行,输出1~num之间的所有素数
样例输入
3
10
2
30
样例输出
2 3 5 7
2
2 3 5 7 11 13 17 19 23 29
题解
#include<bits/stdc++.h> using namespace std; struct devided_by { int d; devided_by(int _d) { d = _d; } bool operator()(int n) { return n % d == 0 && n != d; } }; void Sieve(int n) { vector<int> prime; for (int i = 2; i <= n; i++) { prime.push_back(i); } auto end = prime.end(); for (auto v = prime.begin(); (*v) * (*v) <= n; ++v) { end = remove_if(prime.begin(), end, devided_by(*v)); } cout << prime[0]; for (auto i = prime.begin() + 1; i != end; i++) { cout << " " << *i; } cout << endl; } int main() { int n, t; cin >> t; while (t--) { cin >> n; Sieve(n); } }
3.扑克牌整理(算法与仿函数)
题目描述
扑克牌中有四种花色,从大到小依次为:spade, heart, club, diamond,点数从1到13。小明想将一堆扑克牌中的所有点数大于等于n的某种花色的扑克牌挑出来,并按点数升序排序。请你帮助一下他。
提示:sort 、partition。
输入
测试多组,直到输入结束
每组测试,首先扑克牌张数t,随后输入t张扑克牌花色和点数
接着输入要挑选的次数p
接着输入每次要挑选的扑克牌花色和最小点数n
输出
首先输出挑出来的每张牌
然后输出挑出来的扑克牌数量
样例输入
16
spade 2
spade 13
heart 3
spade 6
club 7
diamond 9
spade 12
heart 10
spade 1
club 2
diamond 8
spade 3
heart 4
spade 11
club 5
diamond 7
2
club 8
diamond 2
样例输出
0
diamond 7
diamond 8
diamond 9
3
题解
#include<bits/stdc++.h> using namespace std; struct card { string color; int num; card(string c, int n) : color(c), num(n) {} }; struct divide_c { card cd; divide_c(string _col, int _num) : cd(_col, _num) {} bool operator()(card &c) { return (c.color == cd.color && c.num > cd.num); } }; string ccard; int nnum; bool part(card c) { return c.color == ccard && c.num >= nnum; } int main() { int n, q; while (cin >> n) { string cd; int num; vector<card> c; for (int i = 0; i < n; i++) { cin >> cd >> num; c.push_back(card(cd, num)); } sort(c.begin(), c.end(), [](card a, card b) { return a.num < b.num; }); cin >> q; while (q--) { cin >> cd >> num; ccard = cd; nnum = num; card now = card(cd, num); auto end = stable_partition(c.begin(), c.end(), part); int cnt = 0; for (auto i = c.begin(); i != end; i++) { cout << i->color << " " << i->num << endl; cnt++; } cout << cnt << endl; } } }
4.前驱后继(list)
题目描述
在双向链表中,A有一个指针指向了后继节点B,同时,B又有一个指向前驱节点A的指针。这样不仅能从链表头节点的位置遍历整个链表所有节点,也能从链表尾节点开始遍历所有节点。
对于给定的一列数据,按照给定的顺序建立双向链表,按照关键字找到相应节点,输出此节点的前驱节点关键字及后继节点关键字。
输入
第一行两个正整数n(代表节点个数),m(代表要找的关键字的个数)。
接下来输入n个整数为关键字key(数据保证关键字在数列中没有重复)。
接下来有m个要查找的关键字,每个占一行。
输出
对给定的每个关键字,输出此关键字前驱节点关键字和后继节点关键字。如果给定的关键字没有前驱或者后继,则不输出。给定关键字为每个输出占一行。
样例输入
10 3
1 2 3 4 5 6 7 8 9 0
3
1
0
样例输出
2 4
2
9
题解
#include<bits/stdc++.h> using namespace std; int main() { int n, m, x; cin >> n >> m; list<int> l; for (int i = 0; i < n; i++) { cin >> x; l.push_back(x); } while (m--) { cin >> x; for (auto i = l.begin(); i != l.end(); ++i) { if (*i == x) { if (i != l.begin()) { cout << *(--i); ++i; if ((++i) != l.end()) { cout << " " << *i << endl; --i; } else { cout << endl; } } else if ((++i) != l.end()) { cout << *i << endl; --i; } break; } } } return 0; }