排序的使用

时间:2024-02-17 21:35:13

分数线

某小学举办了一场校内的信息学竞赛选拔赛。

现在同学们的成绩都出来了,负责信息学竞赛的老师需要确定最终选拔赛的获奖名单。

为了鼓励大家,老师希望获奖人数不少于参赛总人数的一半。

因此,老师需要确定一个获奖分数线,所有得分在分数线及以上的同学可以获奖。

在满足上面条件的情况下,老师希望获奖分数线越高越好。

请同学们通过程序设计的方法来解决以上问题,确定获奖分数线和总获奖人数。

输入格式 第一行为一个整数 n 表示参赛总人数。

第二行为 n 个整数,分别表示 n(1≤n≤100000) 个参赛同学的分数,

所有分数都是在 0~100 之间的整数(含 0 和 100),每两个数之间用一个空格隔开。

输出格式 输出为一行,包括两个整数,分别表示分数线和获奖人数(中间用一个空格隔开)。

样例输入

7

76 71 42 4 27 27 20

样例输出

27 5

#include <bits/stdc++.h>
using namespace std;
int main()
{
    int n;
    scanf("%d", &n);
    int s[n];
    int cnt = 0;
    for (int i = 0; i < n; i++)
    {
        scanf("%d", &s[i]);
    }
    sort(s, s + n);
    printf("%d ", s[n / 2]);
    for (int i = 0; i < n; i++)
    {
        if (s[i] >= s[n / 2])
        cnt++;
    }
    printf("%d", cnt);
    return 0;
}

红绿蓝

蒜头君有一个罐子,里面装着红的、绿的、蓝的玻璃珠若干,分别用 R、G、B 表示。

蒜头君希望把它们排成一行,并且按照字典序排列(即 B -> G -> R 的顺序)。

然后以一红二绿三蓝为一组串成一串幸运珠,多余的放回罐子里,那么他能串成多少串幸运珠呢?

输入格式

输入为一行,是一个由若干个 R、G、B 乱序组成的字符串,长度小于 10000,每个字母至少出现一次。

输出格式

输出共 2 行; 第 1 行是排序完成后的字符串; 第 2 行是一个整数,为串成的幸运珠的数目。

样例输入

RGGBBB

样例输出

BBBGGR

1

/*
1.排序
2.可以串成幸运珠的数目,取决于r,g/2,b/3中的最小者
*/
#include <stdio.h>
#include <algorithm>
#include <string.h>
using namespace std;
char str[10005];
int main()
{
    scanf("%s", str);
    int len = strlen(str);
    int cnt[3] = {0};
    for (int i = 0; i < len; i++)
    {
        if (str[i] == \'R\')
        {
            cnt[0]++;
        }
        if (str[i] == \'G\')
        {
            cnt[1]++;
        }
        if (str[i] == \'B\')
        {
            cnt[2]++;
        }
    }
    sort(str, str + len);
    printf("%s\n", str);
    if (cnt[1] / 2 < cnt[0])
    {
        cnt[0] = cnt[1] / 2;
    }
    if (cnt[2] / 3 < cnt[0])
    {
        cnt[0] = cnt[2] / 3;
    }
    printf("%d",cnt[0]);
    return 0;
}

交叉排序

蒜头君很无聊,他想对数组中的某些元素进行排序。

现在我们有 N 个数,他想先将数组中第 l1 到第 r1 的数字按从小到大的顺序排序。

再将数组中第 l2 到第 r2 的数字按从大到小的顺序排序。

我们帮他算一算数组排序后的结果吧~

输入格式 第一行五个整数 N, l1, r1, l2, r2

其中 0 < l1 < r1 < N, 0 < l2 < r2 < N

这五个数不超过 10000; 第二行为 N 个整数。

输出样例 一行 N 个整数,表示数组排序以后的结果,数字之间用空格隔开,末尾换行。

样例输入

6 1 3 2 4

8 3 1 6 9 2

样例输出

1 8 6 3 9 2

//这个破题一直说我格式错误
//我觉得判题判的有问题
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
    int n, l1, r1, l2, r2;
    cin >> n >> l1 >> r1 >> l2 >> r2;
    int a[10000];
    for (int i = 0; i < n; i++)
    {
        cin >> a[i];
    }
    sort(a + l1 - 1, a + r1);
    sort(a + l2 - 1, a + r2, greater<int>());
    for (int i = 0; i < n; i++)
    {
        cout << a[i] << " ";
    }
    cout << endl;
    return 0;
}

前K名的平均数

小蒜的老师希望知道班上的信息学尖子生的水平如何。

老师请小蒜同学帮忙算出班上信息学成绩前 K 名的平均成绩。

输入格式 输入共有三行:

第一行:为小蒜所在班级的人数 N(其中 1≤N≤30);

第二行:为 N 个用 1 个空格隔开的信息学分数(其中分数为 700 及以内正整数);

第三行:老师想计算平均数的尖子生人数 K。

输出格式 输出一行共一个实数,为信息学分数前 K 名同学的分数平均数。四舍五入保留两位小数。

样例输入

10

93 85 77 68 59 100 43 94 75 82

4

样例输出

93.00

#include<stdio.h>
#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
    int n;
    int a[30];
    int k;
    int sum=0;
    scanf("%d",&n);
    for (int i = 0; i < n; i++)
    {
        scanf("%d",&a[i]);
    }
    scanf("%d",&k);
    sort(a,a+n,greater<int>());
    for (int i = 0; i < k; i++)
    {
        sum+=a[i];
    }
    printf("%.2f\n",sum*1.0/k);
    return 0;
}