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

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

5.线性表操作(list)


题目描述


线性表最基本、最简单、也是最常用的一种数据结构。一个线性表是n个具有相同特性的数据元素的有限序列。用list容器存储m个线性表(m<10),并实现线性表的以下操作。


insert i loc e:在第i个表的第loc位置插入元素e。表位置从1开始,有效插入位置1 ~ 表长+1。


delete i loc : 删除第i表的第loc个元素。


merge i j:使用sort方法对第i,j个表升序排序,再使用merge方法将第j个表合并到第i个表。


unique i : 对第i个表降序排序,使用unique方法删除重复元素。


display i: 输出第i个表元素个数及各元素。


所有操作的表序号i,j输入均合法。位置lco, 元素e均为整数,注意判断插入和删除的位置loc。


输入

第一行:表个数m(>0)


第二行到第m+1行,每行一个表的数据,格式为:数据个数n, 后跟n个整数。


第m+2行:操作次数t,后跟t行,每行一个操作,见题目描述。


输出

对t个操作,分别输出一行,输出操作后的表。具体输出格式见样例。


样例输入

3

10 43 54 23 12 76 -4 53 50 34 10

3 3 243 12

6 3 12 32 42 53 50

7

insert 1 1 15

delete 2 3

merge 2 3

unique 2

display 3

delete 1 1

insert 1 12 200


样例输出

11 15 43 54 23 12 76 -4 53 50 34 10

2 3 243

8 3 3 12 32 42 50 53 243

7 243 53 50 42 32 12 3

0

10 43 54 23 12 76 -4 53 50 34 10

10 43 54 23 12 76 -4 53 50 34 10


题解

#include<bits/stdc++.h>
using namespace std;
int main() {
    int n, m, num;
    cin >> m;
    list<list<int> > l(m);
    for (auto &i : l) {
        cin >> n;
        for (int j = 0; j < n; j++) {
            cin >> num;
            i.push_back(num);
        }
    }
    int q;
    cin >> q;
    for (int i = 0; i < q; i++) {
        string op;
        int pos1, pos2, num;
        cin >> op >> pos1;
        pos1--;
        if (op == "insert") {
            cin >> pos2 >> num;
            pos2--;
            auto i = l.begin();
            advance(i, pos1);
            if (0 <= pos2 && pos2 <= i->size()) {
                auto j = i->begin();
                advance(j, pos2);
                i->insert(j, num);
            }
        }
        if (op == "delete") {
            cin >> pos2;
            pos2--;
            auto i = l.begin();
            advance(i, pos1);
            if (0 <= pos2 && pos2 < i->size()) {
                auto j = i->begin();
                advance(j, pos2);
                i->erase(j);
            }
        }
        if (op == "merge") {
            cin >> pos2;
            pos2--;
            auto i = l.begin(), j = l.begin();
            advance(i, pos1);
            advance(j, pos2);
            i->sort();
            j->sort();
            i->merge(*j);
        }
        if (op == "unique") {
            auto i = l.begin();
            advance(i, pos1);
            i->sort(greater<int>());
            i->unique();
        }
        auto I = l.begin();
        advance(I, pos1);
        cout << I->size();
        for (auto j = I->begin(); j != I->end(); j++) cout << " " << *j;
        cout << endl;
    }
}

6.多项式运算(list)


题目描述


一元多项式按照升幂表示为:


Pn(x) = p0+ p1x + p2x2+ … +pnxn。(n>=0)


用list容器存储一元多项式的系数和指数。输入两个一元多项式,求多项式加、减、乘。


输入

测试次数


每组测试数据两行:


第一行,第一个多项式:项数n 系数1 指数1 系数2 指数2 … 系数n 指数n(按升幂给出)


第二行,第二个多项式:项数n 系数1 指数1 系数2 指数2 …系数n 指数n(按升幂给出)


假设系数为整型。


输出

每组测试数据输出三行,分别是两个多项式的加、减、乘。具体输出格式见样例(即通常多项式表示,注意1,-1的情况。)


样例输入

2

3 -9 0 4 1 -3 5

1 -7 0

2 1 0 -1 3

3 1 0 1 1 -1 2


样例输出

-16+4x-3x^5

-2+4x-3x^5

63-28x+21x^5

2+x-x^2-x^3

-x+x^2-x^3

1+x-x^2-x^3-x^4+x^5


题解

#include<bits/stdc++.h>
#define P pair<int,int>
#define scd second
#define fst first
using namespace std;
vector<int> add, mul, sub;
P nowop;
void Add(P cur) {
    add[cur.scd] += cur.fst;
}
void Sub_1(P cur) {
    sub[cur.scd] += cur.fst;
}
void Sub_2(P cur) {
    sub[cur.scd] -= cur.fst;
}
void Mul(P cur) {
    P nowans;
    nowans.scd = cur.scd + nowop.scd;
    nowans.fst = cur.fst * nowop.fst;
    mul[nowans.scd] += nowans.fst;
}
int main() {
    int t, n1, n2;
    cin >> t;
    while (t--) {
        int value, index, n3;
        cin >> n1;
        n3 = max(n1, n2);
        list<P > l1, l2;
        add.clear();
        mul.clear();
        sub.clear();
        for (int i = 0; i < 100; i++) {
            add.push_back(0);
            sub.push_back(0);
            mul.push_back(0);
        }
        for (int i = 0; i < n1; i++) {
            cin >> value >> index;
            l1.push_back(P(value, index));
        }
        cin >> n2;
        for (int i = 0; i < n2; i++) {
            cin >> value >> index;
            l2.push_back(P(value, index));
        }
        for_each(l1.begin(), l1.end(), Add);
        for_each(l2.begin(), l2.end(), Add);
        for_each(l1.begin(), l1.end(), Sub_1);
        for_each(l2.begin(), l2.end(), Sub_2);
        for (auto i = l1.begin(); i != l1.end(); i++) {
            nowop = *i;
            for_each(l2.begin(), l2.end(), Mul);
        }
        ///print ans//
        int flag = 0;
        for (int i = 0; i < add.size(); i++) {
            if (add[i] == 0) continue;
            if (add[i] != 0 && i == 0) {
                cout << add[0];
                flag = 1;
                continue;
            }
            if (add[i] == -1) cout << "-";
            else if (add[i] > 1) {
                if (flag) cout << "+";
                cout << add[i];
            }
            else if (add[i] == 1) { if (flag) cout << "+"; }
            else if (add[i] != 1) cout << add[i];
            if (i >= 1)cout << "x";
            if (i > 1) cout << "^" << i;
            flag = 1;
        }
        if (flag == 0) cout << 0;
        cout << endl;
        flag = 0;
        for (int i = 0; i < sub.size(); i++) {
            if (sub[i] == 0) continue;
            if (sub[i] != 0 && i == 0) {
                cout << sub[0];
                flag = 1;
                continue;
            }
            if (sub[i] == -1) cout << "-";
            else if (sub[i] > 1) {
                if (flag) cout << "+";
                cout << sub[i];
            }
            else if (sub[i] == 1) { if (flag) cout << "+"; }
            else if (sub[i] != 1) cout << sub[i];
            if (i >= 1)cout << "x";
            if (i > 1) cout << "^" << i;
            flag = 1;
        }
        if (flag == 0) cout << 0;
        cout << endl;
        flag = 0;
        for (int i = 0; i < mul.size(); i++) {
            if (mul[i] == 0) continue;
            if (mul[i] != 0 && i == 0) {
                cout << mul[0];
                flag = 1;
                continue;
            }
            if (mul[i] == -1) cout << "-";
            else if (mul[i] > 1) {
                if (flag) cout << "+";
                cout << mul[i];
            }
            else if (mul[i] == 1) { if (flag) cout << "+"; }
            else if (mul[i] != 1) cout << mul[i];
            if (i >= 1)cout << "x";
            if (i > 1) cout << "^" << i;
            flag = 1;
        }
        if (flag == 0) cout << 0;
        cout << endl;
    }
}

7.约瑟夫环(list)


题目描述


N个人围成一个圆圈,每个人都有唯一的一个编号,编号从1到N,从编号为1的人开始报数,依次报到K,报数为K的人出列,他的下一个又从1开始报数,直到所有的人都出列,求这个出列的序列。


(必须用list)


输入


测试次数t


每次输入n和k


输出


出队序列


样例输入


2

5 3

10 4


样例输出


3 1 5 2 4

4 8 2 7 3 10 9 1 6 5


题解

#include<bits/stdc++.h>
#define P pair<int,int>
using namespace std;
int main() {
    int t, n, k;
    cin >> t;
    while (t--) {
        cin >> n >> k;
        list<int> table;
        vector<int> ans;
        for (int i = 1; i <= n; i++) {
            table.push_back(i);
        }
        auto I = table.begin();
        while (table.size()) {
            for (int i = 0; i < k - 1; i++) {
                I++;
                if (I == table.end()) I++;
            }
            auto died = I;
            I++;
            if (I == table.end()) I++;
            ans.push_back(*died);
            table.erase(died);
        }
        for (int i = 0; i < ans.size(); i++) {
            cout << ans[i] << " \n"[i == ans.size() - 1];
        }
    }
}
相关文章
|
26天前
|
算法 搜索推荐 Java
java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题
这篇文章介绍了如何使用Java后端技术,结合Graphics2D和Echarts等工具,生成包含个性化信息和图表的海报,并提供了详细的代码实现和GitHub项目链接。
91 0
java 后端 使用 Graphics2D 制作海报,画echarts图,带工具类,各种细节:如头像切割成圆形,文字换行算法(完美实验success),解决画上文字、图片后不清晰问题
|
1月前
|
算法
计科一二班算法数据结构实验9答案
计科一二班算法数据结构实验9答案
13 0
|
3月前
|
算法 Java 测试技术
算法分析(蛮力法与减治算法应用实验报告)
这篇文章是关于算法分析的实验报告,介绍了如何使用蛮力法解决背包问题,并通过伪代码和Java代码实现,同时分析了其时间效率;还介绍了基于减治法思想实现的二叉查找树的插入与查找,同样提供了伪代码、Java源代码实现和时间效率分析,最后展示了测试结果截图。
算法分析(蛮力法与减治算法应用实验报告)
|
3月前
|
机器学习/深度学习 算法 Java
算法设计(动态规划应用实验报告)实现基于贪婪技术思想的Prim算法、Dijkstra算法
这篇文章介绍了基于贪婪技术思想的Prim算法和Dijkstra算法,包括它们的伪代码描述、Java源代码实现、时间效率分析,并展示了算法的测试用例结果,使读者对贪婪技术及其应用有了更深入的理解。
算法设计(动态规划应用实验报告)实现基于贪婪技术思想的Prim算法、Dijkstra算法
|
3月前
|
算法 Java 测试技术
算法设计(动态规划实验报告) 基于动态规划的背包问题、Warshall算法和Floyd算法
这篇文章介绍了基于动态规划法的三种算法:解决背包问题的递归和自底向上实现、Warshall算法和Floyd算法,并提供了它们的伪代码、Java源代码实现以及时间效率分析。
算法设计(动态规划实验报告) 基于动态规划的背包问题、Warshall算法和Floyd算法
|
3月前
|
算法 搜索推荐
算法设计 (分治法应用实验报告)基于分治法的合并排序、快速排序、最近对问题
这篇文章是关于分治法应用的实验报告,详细介绍了如何利用分治法实现合并排序和快速排序算法,并探讨了使用分治法解决二维平面上的最近对问题的方法,包括伪代码、源代码实现及时间效率分析,并附有运行结果和小结。
|
5月前
|
算法 JavaScript 程序员
程序员必知:《程序设计与算法(二)算法基础》《第一周枚举》熄灯问题POJ
程序员必知:《程序设计与算法(二)算法基础》《第一周枚举》熄灯问题POJ
30 0
|
6月前
|
算法 图形学
【计算机图形学】实验一 DDA算法、Bresenham算法
【计算机图形学】实验一 DDA算法、Bresenham算法
190 3
|
6月前
|
算法 图形学
【计算机图形学】实验三 用Cohen-Sutherland裁剪算法实现直线段裁剪
【计算机图形学】实验三 用Cohen-Sutherland裁剪算法实现直线段裁剪
419 2
|
6月前
|
存储 算法 图形学
【计算机图形学】实验二 用扫描线算法实现多边形填充
【计算机图形学】实验二 用扫描线算法实现多边形填充
191 2