蓝桥杯模拟题——“晚会节目单“

【问题描述】
小明要组织一台晚会,总共准备了 n 个节目。然后晚会的时间有限,他只能最终选择其中的 m 个节目。这 n 个节目是按照小明设想的顺序给定的,顺序不能改变。小明发现,观众对于晚上的喜欢程度与前几个节目的好看程度有非常大的关系,他希望选出的第一个节目尽可能好看,在此前提下希望第二个节目尽可能好看,依次类推。小明给每个节目定义了一个好看值,请你帮助小明选择出 m 个节目,满足他的要求。
【输入格式】
输入的第一行包含两个整数 n, m ,表示节目的数量和要选择的数量。第二行包含 n 个整数,依次为每个节目的好看值。
【输出格式】
输出一行包含 m 个整数,为选出的节目的好看值。
【样例输入】
5 3
3 1 2 5 4

【样例输出】
3 5 4
【样例说明】
选择了第1, 4, 5个节目。
【评测用例规模与约定】
对于 30% 的评测用例,1 <= n<= 20;
对于 60% 的评测用例,1 <= n <= 100;
对于所有评测用例,1 <= n <= 100000,0 <= 节目的好看值 <= 100000。


思路:对于这一题直观上看应该是排序问题,使用一个快速排序即可。

但是输出不是降序输出的,确是按照给出的输入节目单的先后顺序输出前m个最大数。

所以采用了标号的方法,对每一个数按照输入从大到小进行编号,在排列好的前m个最大数在对其标号进行排序,标号小的先输出即可。

进行了两次快速排序

#include <stdio.h>
#include <stdlib.h>
/* run this program using the console pauser or add your own getch, system("pause") or input loop */
void Quicksort(int a[],int Tab[], int low, int high)
{
    if (low >= high)
        return;
    int k = a[1], i = low, j = high;
    while (i != j)
    {
        int tmp;
        while ((j > i) && (a[j] < k))
            j--;
        tmp = a[j];
        a[j] = a[i];
        a[i] = tmp;
        tmp = Tab[j];
        Tab[j] = Tab[i];
        Tab[i] = tmp;
        while ((i < j) && (a[i] > k))
            i++;
        tmp = a[j];
        a[j] = a[i];
        a[i] = tmp;
        tmp = Tab[j];
        Tab[j] = Tab[i];
        Tab[i] = tmp;

    }
    Quicksort(a,Tab, low, i - 1);
    Quicksort(a,Tab, i + 1, high);
}
int main()
{
    int a[100001],Tab[100001];
    int n, m, i;
    scanf_s("%d %d", &n,&m);
    for (i = 1; i <= n; i++)
        scanf_s("%d", &a[i]);
    for (i = 1; i <= n; i++)
        Tab[i] = i;
    Quicksort(a, Tab, 1, n);
    Quicksort(Tab, a, 1, m);
    for (i = m; i > 0; i--)
        printf("%d ", a[i]);
    return 0;
}

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值