C语言程序设计基础|排序类问题

问题一:分类排序

题目描述:

从键盘输入10个整数(10个整数均不相同), 然后再从键盘中输入一个整数a,如果该整数a为奇数, 且与这10个整数中的任一个数相同,则删掉与a相同的 这个数,并将剩下的9个数按升序排序输出;若a为偶数, 且与这10个数都不同,则加入a,并将这11个数降序排 序输出;否则,则将这10个数奇数在前,偶数在后, 降序排列输出。例如,10个数分别为6,89,34,12, 0,-8,78,15,9,3.若a为9,则输出为:-8,0,3, 6,12,15,34,78,89.若a为2,则输出为:89,78, 34,15,12,9,6,3,2,0,-8.若a为7或者12,则 输出为:89,15,9,3,78,34,12,6,0,-8.

输入要求:

测试数据的组数n 第一组测试数据的10个整数 第一组的整数a 第二组测试数据的10个整数 第二组的整数a ......第n组测试数据的10个整数 第n组的整数a

输出要求:

第一组数据排序输出 第二组数据排序输出 .......第n组数据排序输出

#include<iostream>
#include<cmath>
#include<iomanip>
#include<algorithm>
using namespace std;

int main() {
    int n;
    cin >> n;
    while (n--)
    {
        int arr[10], a, b, c;
        for (int i = 0; i < 10; i++)//输入10个整数
        {
            cin >> arr[i];
        }
        cin >> a;
        c = 0;
        for (int j = 0; j < 10; j++)//判断数组中的数是否和a相等
        {
            if (a == arr[j])
            {
                b = arr[j];
                c++;
            }
        }
        int temp1;
        if (abs(a) % 2 && (c == 1))//如果a是奇数而且a和数组中的数相同则删掉并升序输出
        {
            for (int k = 0; k < 10 - 1; k++)//对整个数组进行冒泡排序
            {
                for (int l = 0; l < 10 - 1 - k; l++)
                {
                    if (arr[l] > arr[l + 1])
                    {
                        temp1 = arr[l];
                        arr[l] = arr[l + 1];
                        arr[l + 1] = temp1;
                    }
                }
            }
            for (int m = 0; m < 10; m++)//去掉与a相等的数
            {
                if (arr[m] == b)
                {
                    for (int k = m; k < 10; k++)
                    {
                        arr[k] = arr[k + 1];
                    }
                }
            }
            for (int i = 0; i < 9; i++)
            {
                cout << arr[i] << " \n"[i == 8];
            }
        }
        else if ((abs(a) % 2 == 0) && (c == 0))//如果a是偶数且a和数组中的数不同则添加并降序输出
        {
            int brr[11];
            brr[10] = a;
            for (int i = 0; i < 10; i++)//将数组arr赋值给数组brr,并将a添加到brr中
            {
                brr[i] = arr[i];
            }
            int temp2;
            for (int k = 0; k < 11 - 1; k++)//利用冒泡排序对数组brr排序
            {
                for (int l = 0; l < 11 - 1 - k; l++)
                {
                    if (brr[l] < brr[l + 1])
                    {
                        temp2 = brr[l];
                        brr[l] = brr[l + 1];
                        brr[l + 1] = temp2;
                    }
                }
            }
            for (int m = 0; m < 11; m++)
            {
                cout << brr[m] << " \n"[m == 10];
            }
        }
        else//不符合奇同和偶不同则奇数在前偶数在后降序输出
        {
            int js[10], os[10], s, o;
            s = 0;
            o = 0;
            for (int k = 0; k < 10; k++)//对数组中的奇偶进行分类
            {
                if (abs(arr[k]) % 2)
                {
                    js[s] = arr[k];
                    s++;
                }
                else
                {
                    os[o] = arr[k];
                    o++;
                }
            }
            int temp3;
            for (int k = 0; k < s - 1; k++)//对奇数进行冒泡排序,使其降序
            {
                for (int l = 0; l < s - 1 - k; l++)
                {
                    if (js[l] < js[l + 1])
                    {
                        temp3 = js[l];
                        js[l] = js[l + 1];
                        js[l + 1] = temp3;
                    }
                }
            }
            for (int m = 0; m < s; m++)
            {
                cout << js[m] << " ";
            }
            int temp4;
            for (int k = 0; k < o - 1; k++)//同理
            {
                for (int l = 0; l < o - 1 - k; l++)
                {
                    if (os[l] < os[l + 1])
                    {
                        temp4 = os[l];
                        os[l] = os[l + 1];
                        os[l + 1] = temp4;
                    }
                }
            }
            for (int m = 0; m < o; m++)
            {
                cout << os[m] << " \n"[m == o - 1];
            }
        }
    }
    return 0;
}

题目要求是写成函数的形式,请读者自行借阅……

问题二:排座椅

题目描述:

上课的时候总会有一些同学和前后左右的人交头接耳,这是令小学班主任十分头疼的一件事情。不过,班主任小雪发现了一些有趣的现象,当同学们的座次确定下来之后,只有有限的D对同学上课时会交头接耳。同学们在教室中坐成了M行N列,坐在第i行第j列的同学的位置是(i,j),为了方便同学们进出,在教室中设置了K条横向的通道,L条纵向的通道。于是,聪明的小雪想到了一个办法,或许可以减少上课时学生交头接耳的问题:她打算重新摆放桌椅,改变同学们桌椅间通道的位置,因为如果一条通道隔开了两个会交头接耳的同学,那么他们就不会交头接耳了。

请你帮忙给小雪编写一个程序,给出最好的通道划分方案。在该方案下,上课时交头接耳的学生的对数最少。

输入要求:

有5个用空格隔开的整数,分别是M,N,K,L,D(2<=N,M<=1000,0<=K<M,0<=L<N,D<=2000)。

接下来的D行,每行有4个用空格隔开的整数。第i行的4个整数Xi,Yi,Pi,Qi,表示坐在位置(Xi,Yi)与(Pi,Qi)的两个同学会交头接耳(输入保证他们前后相邻或者左右相邻)。

输入数据保证最优方案的唯一性。

输出要求:

第一行包含K个整数,a1,a2……aK,表示第a1行和a1+1行之间、第a2行和a2+1行之间、…、第aK行和第aK+1行之间要开辟通道,其中ai< ai+1,每两个整数之间用空格隔开(行尾没有空格)。

第二行包含L个整数,b1,b2……bL,表示第b1列和b1+1列之间、第b2列和b2+1列之间、…、第bL列和第bL+1列之间要开辟通道,其中bi< bi+1,每两个整数之间用空格隔开(列尾没有空格)。

#include<iostream>
#include<cmath>
#include<iomanip>
#include<algorithm>
#include<cstring>
using namespace std;

int main() {
    int m, n, k, l, D;
    cin >> m >> n >> k >> l >> D;
    int col[10000], row[10000];
    memset(col, 0, 10000 * sizeof(int));//将标记行列的数组都赋值为0
    memset(row, 0, 10000 * sizeof(int));
    while (D--)
    {
        int x, y, p, d, minn;
        cin >> x >> y >> p >> d;
        if (x == p)//两者在同一行,小的列标+1
        {
            minn = min(y, d);
            col[minn]++;
        }
        if (y == d)//两者在同一列,小的行标+1
        {
            minn = min(x, p);
            row[minn]++;
        }
    }
    int arr1[l], arr2[k], max0;//arr1记录纵线,arr2记录横线
    for (int a = 0; a < l; a++)//要找l条纵线
    {
        int site = 0;
        max0 = 0;
        for (int b = 1; b < n; b++)//依次找出纵线上最多对的一条
        {
            if (col[b] > max0)
            {
                max0 = col[b];
                site = b;
            }
        }
        arr1[a] = site;//标记位置
        col[site] = 0;//原位置清零
    }
    for (int a = 0; a < k; a++)//要找k条横线
    {
        int site = 0;
        max0 = 0;
        for (int b = 1; b < m; b++)//依次找出横线上最多对的一条
        {
            if (row[b] > max0)
            {
                max0 = row[b];
                site = b;
            }
        }
        arr2[a] = site;//标记位置
        row[site] = 0;//原位置清零
    }
    for (int a = 0; a < l - 1; a++)//对纵线进行冒泡排序
    {
        for (int b = 0; b < l - a - 1; b++)
        {
            int temp1;
            if (arr1[b] > arr1[b + 1])
            {
                temp1 = arr1[b];
                arr1[b] = arr1[b + 1];
                arr1[b + 1] = temp1;
            }
        }
    }
    for (int a = 0; a < k - 1; a++)//对横线进行冒泡排序
    {
        for (int b = 0; b < k - a - 1; b++)
        {
            int temp2;
            if (arr2[b] > arr2[b + 1])
            {
                temp2 = arr2[b];
                arr2[b] = arr2[b + 1];
                arr2[b + 1] = temp2;
            }
        }
    }
    for (int i = 0; i < k; i++)
    {
        cout << arr2[i] << " \n"[i == k - 1];
    }
    for (int i = 0; i < l; i++)
    {
        cout << arr1[i] << " \n"[i == l - 1];
    }
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

再给艾克三年

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值