基于快排的题目

文章介绍了一个问题解决方案,即如何在固定数量的蛋糕盒中装入尽可能多的蛋糕。通过创建结构体存储每个蛋糕盒的数量和蛋糕数,然后使用快速排序算法按蛋糕数降序排列,从而实现最大蛋糕数量的选取。最终累加前n个最大蛋糕数输出结果。
摘要由CSDN通过智能技术生成

根据题目可得,每个蛋糕盒的大小相同,背包恰好能装 n 个蛋糕盒,要求最大蛋糕数量,只需要每个蛋 糕盒中蛋糕尽可能的多,所以我们只需要将所有蛋糕盒中的蛋糕数存入数组,然后从大到小排序,输出前 n 个即可,可以设计一个结构体去存储每个货柜中的蛋糕盒数和 每个蛋糕盒内的蛋糕数,然后按蛋糕盒中的蛋糕数目排序。

1.设计结构体;

struct are {
    int a;   //蛋糕盒数目
    int b;   //该盒中蛋糕数目
};

2.进行排序;

采用快排算法使得时间复杂度减小;

快排思想在此链接:http://t.csdn.cn/uQGCP

3.计数累加即可;

#include <iostream> 
#include <cassert>
using namespace std;
struct are {
    int a;
    int b;
};
int Sort(are* p, int left, int right)
{
    assert(nullptr != p);
    are tem = p[left];
    while (left < right)
    {
        while (p[right].b >= tem.b && left < right)  right--;         
        p[left] = p[right];
        while (p[left].b < tem.b && left < right)  left++;
        p[right] = p[left];
    }
    p[left] = tem;
    return left;
}
void QuickSort(are* p, int left, int right)
{
    assert(nullptr != p);
    if (left >= right) return;
    int mid = Sort(p, left, right);
    QuickSort(p, left, mid - 1);
    QuickSort(p, mid + 1, right);
}
int main()
{
    int m, n;
    int sum = 0;
    are w[20];
    cin >> n >> m;
    for (int i = 0; i < m; i++)
    {
        cin >> w[i].a >> w[i].b;
    }
    QuickSort(w, 0, m - 1);
       for (int i = m - 1; i >= 0;)
    {
        while (n>0 && w[i].a > 0)
        {
                sum += w[i].b;
                w[i].a -= 1;
                n -= 1;        
        }
        i--;
        if (n <= 0) break;
    }
    cout << sum;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值