面向对象程序设计(荣誉)实验三 算法及list(上)

简介: 面向对象程序设计(荣誉)实验三 算法及list(上)

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;
}
相关文章
|
11月前
|
算法 搜索推荐 Java
java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题
这篇文章介绍了如何使用Java后端技术,结合Graphics2D和Echarts等工具,生成包含个性化信息和图表的海报,并提供了详细的代码实现和GitHub项目链接。
654 0
java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题
|
算法 Java 测试技术
算法分析(蛮力法与减治算法应用实验报告)
这篇文章是关于算法分析的实验报告,介绍了如何使用蛮力法解决背包问题,并通过伪代码和Java代码实现,同时分析了其时间效率;还介绍了基于减治法思想实现的二叉查找树的插入与查找,同样提供了伪代码、Java源代码实现和时间效率分析,最后展示了测试结果截图。
算法分析(蛮力法与减治算法应用实验报告)
|
11月前
|
算法
计科一二班算法数据结构实验9答案
计科一二班算法数据结构实验9答案
73 0
|
机器学习/深度学习 算法 Java
算法设计(动态规划应用实验报告)实现基于贪婪技术思想的Prim算法、Dijkstra算法
这篇文章介绍了基于贪婪技术思想的Prim算法和Dijkstra算法,包括它们的伪代码描述、Java源代码实现、时间效率分析,并展示了算法的测试用例结果,使读者对贪婪技术及其应用有了更深入的理解。
算法设计(动态规划应用实验报告)实现基于贪婪技术思想的Prim算法、Dijkstra算法
|
算法 Java 测试技术
算法设计(动态规划实验报告) 基于动态规划的背包问题、Warshall算法和Floyd算法
这篇文章介绍了基于动态规划法的三种算法:解决背包问题的递归和自底向上实现、Warshall算法和Floyd算法,并提供了它们的伪代码、Java源代码实现以及时间效率分析。
算法设计(动态规划实验报告) 基于动态规划的背包问题、Warshall算法和Floyd算法
|
算法 搜索推荐
算法设计 (分治法应用实验报告)基于分治法的合并排序、快速排序、最近对问题
这篇文章是关于分治法应用的实验报告,详细介绍了如何利用分治法实现合并排序和快速排序算法,并探讨了使用分治法解决二维平面上的最近对问题的方法,包括伪代码、源代码实现及时间效率分析,并附有运行结果和小结。
|
算法 图形学
【计算机图形学】实验一 DDA算法、Bresenham算法
【计算机图形学】实验一 DDA算法、Bresenham算法
948 3
|
算法 图形学
【计算机图形学】实验三 用Cohen-Sutherland裁剪算法实现直线段裁剪
【计算机图形学】实验三 用Cohen-Sutherland裁剪算法实现直线段裁剪
1033 2
|
存储 算法 图形学
【计算机图形学】实验二 用扫描线算法实现多边形填充
【计算机图形学】实验二 用扫描线算法实现多边形填充
772 2
|
算法 JavaScript 程序员
程序员必知:《程序设计与算法(二)算法基础》《第一周枚举》熄灯问题POJ
程序员必知:《程序设计与算法(二)算法基础》《第一周枚举》熄灯问题POJ
105 0

热门文章

最新文章