重庆大学c++、2022级-第5次实验-运用STL的容器和算法编写程序

7-2 部分排序

分数 10

全屏浏览题目

切换布局

作者 周强

单位 青岛大学

对于一组数据,我们可以只对原先处在中间位置的那些元素进行排序。

输入格式:

在一行内输入n r a1 a2 ... an

其中,不大于200的正整数n表示该组数据的个数;不大于200的非负整数r表示该组数据两端各自留有r个数不参与排序,若r+r>=n,则该组数据无需排序。

整数a1 a2 ... an是该组的n个数据,且都在8位以内。

输出格式:

排序之后的序列,元素之间用一个空格间隔,最后一个元素之后不加空格。

输入样例:

5 1 6 5 4 3 2

输出样例:

6 3 4 5 2

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

#include<iostream>
using namespace std;
int main()
{
    int n, r;
    cin >> n >> r;
    int a[300];
    
    for (int i = 0; i < n; i++)
    {
        cin >> a[i];
    }
    
    int temp;
    if (r + r < n)
    {
        
        for (int k = 1, i = r; i < n - r; i++, k++)//设置一个k值使得下面遍历次数改变
        {
            for (int j = r; j < n - r - k; j++)
            {
                if (a[j] > a[j + 1])
                {
                    temp = a[j];
                    a[j] = a[j + 1];
                    a[j + 1] = temp;
                }
            }
        }
    }
    for (int i = 0; i < n; i++)
    {
        if (i == 0)
        {
            cout << a[i];
        }
        else
            cout << " " << a[i];
        
    }
    return 0;
}

 7-3 办事大厅排队

分数 10

全屏浏览题目

切换布局

作者 吴云鹏

单位 郑州大学

在郑州大学综合办事大厅,每天陆陆续续有很多人来排队办事。现在你能否写程序帮助老师时刻了解当前办理业务的情况。

请同学们学习C++ STL中 list相关内容后,编程实践。

输入格式:

第一行一个数字N,表示排队信息或者查询信息条目的数量。

以下N行,每行的内容有以下3种情况

(1) in name 表示名字为name的人员新来到办事大厅,排在队伍的最后。(in和name间存在一个空格,name是名字对应字符串,长度不超过10)。

(2) out 表示当前排在最前面的人已经办理完业务,离开了。

(3) q 表示一次查询,请输出当前正在办理业务的人,也就是队伍的第1个人。如果当前无人办理业务,则输出“NULL”,不包括引号。

输出格式:

请根据以上信息,每次遇到查询时,对应一行输出。如果这时队伍有人,则输出第一个人的姓名,否则输出NULL。

输入样例:

5
in A
out
q
in B
q

输出样例:

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

NULL
B

代码长度限制

16 KB

时间限制

1000 ms

内存限制

64 MB

#include<cmath>
#include<cstdio>
#include<algorithm>
#include<string>
#include<vector>
#include<iomanip>
#include<iostream>
#include<cstring>
#include <list>
using namespace std;
int main()
{
    int n;
    string s,name;
    cin>>n;
    list<string> l;
    while(n--)
    {
        cin>>s;
        if(s=="in")
        {
            cin>>name;
            l.push_back(name);
        }
        else if(s=="out")
        {
            l.pop_front();
        }
        else if(s=="q")
        {
            if(l.empty())
            {
                cout<<"NULL"<<endl;
            }else
            {
                cout<<l.front()<<endl;
            }
        }
    }

    return 0;
}

7-3 找出不是两个数组共有的元素

分数 10

全屏浏览题目

切换布局

作者 张彤彧

单位 浙江大学

给定两个整型数组,本题要求找出不是两者共有的元素。

输入格式:

输入分别在两行中给出两个整型数组,每行先给出正整数N(≤20),随后是N个整数,其间以空格分隔。

输出格式:

在一行中按照数字给出的顺序输出不是两数组共有的元素,数字间以空格分隔,但行末不得有多余的空格。题目保证至少存在一个这样的数字。同一数字不重复输出。

输入样例:

10 3 -5 2 8 0 3 5 -15 9 100
11 6 4 8 2 6 -5 9 0 100 8 1

输出样例:

3 5 -15 6 4 1

代码长度限制

16 KB

时间限制

400 ms

内存限制

64 MB

#include<iostream>
using namespace std;
int main()
{
	int a[20] = { 0 }, b[20] = { 0 }, c[41] = { 0 }, i, ii, iii, n, m, count = 0, num = 0;
	cin >> n;
	//num代表数组c的输出项数,i是for循环需要用到的,count判断数据是否重复
	for (i = 0; i < n; i++)
	{
		cin >> a[i];
	}
	cin >> m;
	for (i = 0; i < m; i++)
	{
		cin >> b[i];
	}
	for (i = 0; i < n; i++) {
		for (ii = 0; ii < m; ii++) {
			if (a[i] != b[ii])
			{
				count++;
			}//如果count和输入数据个数相同,那么就表示这个数据符合不相等的条件
			else break;
		}
		if (count == m)
		{
			c[num] = a[i];
			num++;
		}
		count = 0;
	}                                        //将第一个数组内符合条件数据写入数组c[]
	for (i = 0; i < m; i++)
	{
		for (ii = 0; ii < n; ii++)
		{
			if (b[i] != a[ii])
			{
				count++;
			}
		}
		if (count == n)
		{
			c[num] = b[i];
			num++;
		}
		count = 0;
	}                                         //将第二个数组内符合条件数据写入数组c[]
	for (i = 0; i < num; i++) {
		for (ii = i + 1; ii < num; ii++) {
			if (c[i] == c[ii]) {
				//数据重复后,把靠后的那个重复数据之后的数据全部向前移动一项,从而达到消除相同数据的目的
				for (iii = 0; iii < num - ii; iii++) {
					c[ii + iii] = c[ii + iii + 1];
				}
				ii--;
				num--;
			}
		}
	}
	for (i = 0; i < num; i++) 
	{
		if (i == 0)
		{
			cout << c[i];
		}
		if (i != 0)
		{
			cout << " " << c[i];
		}
	}
	return 0;
}

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值