SDUT PTA 顺序表

s7-1 顺序表的建立及遍历

读入n值及n个整数,建立顺序表并遍历输出。

输入格式:

读入n及n个整数

输出格式:

输出n个整数,以空格分隔(最后一个数的后面没有空格)。

输入样例:

在这里给出一组输入。例如:

4
-3 10 20 78

输出样例:

在这里给出相应的输出。例如:

-3 10 20 78

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

#include<bits/stdc++.h>
using namespace std;

typedef long long LL;
const int eps = 1e-8;// 一个极小值
const int N = 1e4 + 100;
const int M = 3e3 + 100;
const int INF = 0x3f3f3f3f;
const LL LINF = 0x3f3f3f3f3f3f3f3f;

int a[N];
int main()
{
    int n;
    cin >> n;
    for(int i = 0; i < n; i++){
        cin >> a[i];
    }
    for(int i = 0; i < n; i++){
        if(i == n - 1) cout << a[i] << endl;
        else cout << a[i] << " ";
    }
    return 0;
}

7-2 递增有序顺序表的插入

实验目的:1、掌握线性表的基本知识 2、深入理解、掌握并灵活运用线性表。3、熟练掌握线性表的存储结构及主要运算的实现
已知顺序表L递增有序,将X插入到线性表的适当位置上,保证线性表有序。。

输入格式:

第1行输入顺序表长度,第2行输入递增有序的顺序表,第3行输入要插入的数据元素X。

输出格式:

对每一组输入,在一行中输出插入X后的递增的顺序表。

输入样例:

在这里给出一组输入。例如:

5
1 3 5 7 9
6

输出样例:

在这里给出相应的输出。例如:

1,3,5,6,7,9,

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

#include<bits/stdc++.h>
using namespace std;

int a[200];// 不知为什么是200,大概是因为题目数据量小
int main()
{
    int n;
    cin >> n;
    for(int i = 0; i < n; i++){
        cin >> a[i];
    }
    int x;
    cin >> x;
    a[n] = x;
    for(int i = n; i > 0; i--){
        if(a[i] < a[i - 1]){
            int j = a[i];
            a[i] = a[i - 1];
            a[i - 1] = j;
        }
    }
    for(int i = 0; i <= n; i++){
        printf("%d,", a[i]);
    }
    return 0;
}

7-3 顺序表(删除)

已知一组数据,采用顺序存储结构存储,其中所有的元素为整数。设计一个算法,删除元素值在[x,y]之间的所有元素

输入格式:

输入包含三行数据,第一行是表中元素个数,第二行是顺序表的各个元素,第三行是区间x和y。

输出格式:

删除元素值在[x,y]之间的所有元素后,输出新的顺序表。(最后无空格)

输入样例:

在这里给出一组输入。例如:

10
55 11 9 15 67 12 18 33 6 22
10 20

输出样例:

在这里给出相应的输出。例如:

55 9 67 33 6 22

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

#include<bits/stdc++.h>
using namespace std;

typedef long long LL;
const int eps = 1e-8;// 一个极小值
const int N = 1e4 + 100;
const int M = 3e3 + 100;
const int INF = 0x3f3f3f3f;
const LL LINF = 0x3f3f3f3f3f3f3f3f;

int a[N], b[N];
int main()
{
    int n;
    cin >> n;
    for(int i = 0; i < n; i++){
        cin >> a[i];
    }
    int x, y;
    cin >> x >> y;
    int j = 0;
    for(int i = 0; i < n; i++){
        if(a[i] > y || a[i] < x){
            b[j] = a[i];
            j++;
        }
    }
    for(int i = 0; i < j - 1; i++){
        printf("%d ", b[i]);
    }
    if(j == 0 || n == 0){// 如果没有符合条件的数或输入的数是0个
        cout << endl;
        return 0;
    }
    cout << b[j - 1];
    return 0;
}

7-4 数组元素循环右移n位

从键盘接收两个整数m和n,分别表示一维整型数组的元素个数,和要向移动的位数。已知0<m<=100,以及n>0。

在用户输入m和n后,第二行输入相应个数的数组元素。

程序要实现的功能是,让数组元素往右移动n位

例如,数组的5个元素是:1,2,3,4,5。

往右移动1位后:5,1,2,3,4

往右移动2位后:4,5,1,2,3

输入格式:

第一行输入两个整数,第二行输入数组元素。

输出格式:

移动后,数组的每一个元素,注意每个数组元素后有且仅有一个空格。

输入样例:

第一行的数据5和2,表示数组容量为5,让数组元素往右移动2个位置。

第二行是数组的每一个元素的值。

5 2
1 2 3 4 5 

输出样例:

输出移动后的数组元素值,注意每个元素后有且仅有一个空格。

4 5 1 2 3 

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

#include <bits/stdc++.h>
using namespace std;

const int N = 110;
int a[N];
int main()
{
    int m, n;
    cin >> m >> n;
    for(int i = 0; i < m; i++){
        cin >> a[i];
    }
    int t;
    for(int j = 0; j < m; j++){
        while(n > m) n -= m;
        t = (m - n + j) % m;
        printf("%d ", a[t]);
    }
    return 0;
}

7-5 单词逆置

输入一个可能包含若干(至少1个)单词的句子(可以假设每个单词之间有且仅有一个空格,标点符号视为单词的组成部分),输出每个单词逆置后的英文句子(参看样例输出)。

输入格式:

首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。每组测试数据输入一个字符串(长度不超过80),表示英文句子。

输出格式:

对于每组测试,输出每个单词逆置后的英文句子。

输入样例:

1
emoclew era uoY

输出样例:

welcome are You

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

#include<bits/stdc++.h>
using namespace std;

void Reverse(char *beg, char *ed){
    char t = 0;
    while(beg < ed){
        t = *beg;
        *beg = *ed;
        *ed = t;// 一个一个字母地倒换
        
        beg++;
        ed--;
    }
}
int main()
{
    int t;
    cin >> t >> ws;
    while(t--){
        char str[85];
        scanf("%[^\n]", str);
        getchar();// 吸收空格
        char *beg = str;
        int n = strlen(str);
        for(int i = 0; i <= n; i++){
            if(str[i] == ' ' || str[i] == '\0'){
                Reverse(beg, str + i - 1);
                beg = str + i + 1;
            }
        }
        printf("%s\n", str);
    }
    return 0;
}

**这篇博客内容和该题相似(我就是按ta的思路写的):C语言 : 将一句话的单词进行倒置(逆序)_niceffking的博客-CSDN博客_c语言单词逆置 

**ws:吸收一段空格。详见:

C++ ws(WhiteSpace)_良月澪二的博客-CSDN博客

7-6 最大子列和问题

给定K个整数组成的序列{ N1​, N2​, ..., NK​ },“连续子列”被定义为{ Ni​, Ni+1​, ..., Nj​ },其中 1≤i≤j≤K。“最大子列和”则被定义为所有连续子列元素的和中最大者。例如给定序列{ -2, 11, -4, 13, -5, -2 },其连续子列{ 11, -4, 13 }有最大的和20。现要求你编写程序,计算给定整数序列的最大子列和。

本题旨在测试各种不同的算法在各种数据情况下的表现。各组测试数据特点如下:

  • 数据1:与样例等价,测试基本正确性;
  • 数据2:102个随机整数;
  • 数据3:103个随机整数;
  • 数据4:104个随机整数;
  • 数据5:105个随机整数;

输入格式:

输入第1行给出正整数K (≤100000);第2行给出K个整数,其间以空格分隔。

输出格式:

在一行中输出最大子列和。如果序列中所有整数皆为负数,则输出0。

输入样例:

6
-2 11 -4 13 -5 -2

输出样例:

20

代码长度限制

16 KB

时间限制

50000 ms

内存限制

64 MB

#include<bits/stdc++.h>
using namespace std;

const int N = 1e5 + 10;
int a[N];
int maxnn(int n, int x[]){
    int maxn = 0, t = 0;
    for(int i = 0; i < n; i++){
        t += x[i];
        if(t < 0) t = 0;
        if(t > maxn) maxn = t;
    }
    return maxn;
}
int main()
{
    int k;
    cin >> k;
    for(int i = 0; i < k; i++){
        cin >> a[i];
    }
    cout << maxnn(k, a) << endl;
    return 0;
}

7-7 一元多项式的乘法与加法运算

设计函数分别求两个一元多项式的乘积与和。

输入格式:

输入分2行,每行分别先给出多项式非零项的个数,再以指数递降方式输入一个多项式非零项系数和指数(绝对值均为不超过1000的整数)。数字间以空格分隔。

输出格式:

输出分2行,分别以指数递降方式输出乘积多项式以及和多项式非零项的系数和指数。数字间以空格分隔,但结尾不能有多余空格。零多项式应输出0 0

输入样例:

4 3 4 -5 2  6 1  -2 0
3 5 20  -7 4  3 1

输出样例:

15 24 -25 22 30 21 -10 20 -21 8 35 6 -33 5 14 4 -15 3 18 2 -6 1
5 20 -4 4 -5 2 9 1 -2 0

代码长度限制

16 KB

时间限制

200 ms

内存限制

64 MB

#include<bits/stdc++.h>
using namespace std;

typedef long long LL;
const int eps = 1e-8;// 一个极小值
const int N = 1e4 + 100;
const int M = 3e3 + 100;
const int INF = 0x3f3f3f3f;
const LL LINF = 0x3f3f3f3f3f3f3f3f;

int a[N], b[N];// 分别存储两个多项式的系数,下标代表指数
int cheng[N], he[N];
int main()
{
    int t, ai, xi;
    cin >> t;
    while(t--){
        cin >> ai >> xi;
        a[xi] += ai;// 将系数与指数对应存储
    }
    int n;
    cin >> n;
    while(n--){
        cin >> ai >> xi;
        b[xi] += ai;
    }
    // 乘
    for(int i = 0; i < N; i++){
        if(a[i]){
            for(int j = 0; j < N; j++){
                if(b[j]){
                    cheng[i + j] += a[i] * b[j];
                }
            }
        }
    }
    // 加
    for(int i = 0; i < N; i++){
        if(a[i]) he[i] += a[i];
    }
    for(int i = 0; i < N; i++){
        if(b[i]) he[i] += b[i];
    }
    // 输出格式有、意思 
    int f = 0;
    for(int i = N - 1; i >= 0; i--){
        if(cheng[i]){
            if(f != 0) printf(" ");
            printf("%d %d", cheng[i], i);
            f++;
        }  
    }
    if(f == 0) printf("0 0");
    printf("\n");
    f = 0;
    for(int i = N - 1; i >= 0; i--){
        if(he[i]){
            if(f != 0) printf(" ");
            printf("%d %d", he[i], i);
            f++;
        } 
    }
    // 两个都需要判断是否为零多项式欧~
    if(f == 0) printf("0 0");
    return 0;
}

**题目给的要求是1e3,但是N为1e3的话会有一个测试点不过。。。用1e4就好了,不知道为什么

**这个方法的输出格式好坑凸(艹皿艹 )

7-8 合并有序数组

给定2个非降序序列,要求把他们合并成1个非降序序列。假设所有元素个数为N,要求算法的时间复杂度为O(N)。

输入格式:

输入有4行。
第1行是一个正整数m,表示第2行有m个整数,这些整数构成一个非降序序列,每个整数之间以空格隔开。第3行是一个正整数n,表示第4行有n个整数,这些整数也构成一个非降序序列,每个整数之间以空格隔开。

输出格式:

把第2行的m个整数和第4行的n个整数合并成一个非降序序列,输出这个整数序列。每个数之间隔1个空格。

输入样例:

6
1 3 6 6 8 9  
4
2 4 5 7

输出样例:

1 2 3 4 5 6 6 7 8 9 

代码长度限制

16 KB

时间限制

100 ms

内存限制

64 MB

#include<bits/stdc++.h>
using namespace std;

const int N = 1e5 + 10;
int a[N], b[N], c[N * 2];
int main()
{
    int m, n;
    cin >> m;
    for(int i = 0; i < m; i++) cin >> a[i];
    cin >> n;
    for(int i = 0; i < n; i++) cin >> b[i];
    int i = 0, j = 0, t = 0;
    while(i < m && j < n){
        if(a[i] <= b[j]) c[t++] = a[i++];
        else c[t++] = b[j++];
    }
    while(i < m) c[t++] = a[i++];
    while(j < n) c[t++] = b[j++];
    for(int i = 0; i < t; i++) cout << c[i] << " ";
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值