2023年第十四届蓝桥杯C/C++ A组 F题 买瓜

本文介绍了一个使用深度优先搜索解决的买瓜问题,通过剪枝操作和后缀和数组优化算法,降低了最坏时间复杂度,确保在给定条件下找到最少切瓜次数。
摘要由CSDN通过智能技术生成

试题 F:买瓜

对于每一个西瓜,会有三种状态:买,买一半,不买。

利用深度优先搜索得到的搜索树是一棵完全三叉树,最坏时间复杂度为 O ( n 3 ) O(n^3) O(n3)​。这样肯定会超时,于是我们需要采取相关的剪枝操作

由于西瓜重量取一半时有可能出现小数,所以将目标重量和每个西瓜的重量都*2来规避小数的情况。

搜索前我们定义一个后缀和数组 suf,用来记录购买当前西瓜之后的所有西瓜所能达到的最大重量;同时将西瓜重量数组降序排列,这样可使剪枝效果达到最优。

搜索时我们记录三个状态,当前所在层数 pos,当前西瓜重量和 sum,当前切瓜次数 cnt,当满足条件:

  • pos>=n:所有层都遍历完成
  • cnt>=ans:当前切瓜次数已经大于之前切瓜次数的最小值
  • sum>m:当前西瓜重量大于购买总重量
  • sum+suf[pos]<m:当前位置之后所有西瓜被购买也无法达到购买总重量

就进行剪枝操作,最后输出运行结果。

#include <iostream>
#include <algorithm>

using namespace std;
const int N = 30;

int n, m; // n:西瓜数量 m:西瓜购买重量
int weights[N]; // 重量数组
long suf[N + 1]; // 重量数组的后缀数组
int ans = INT8_MAX; // 将结果初始化为INT8_MAX

/**
 * 进行深度优先搜索
 *
 * @param pos 当前搜索层数
 * @param sum 当前西瓜重量和
 * @param cnt 当前切瓜次数
 */
void dfs(int pos, long sum, int cnt) {
    // 找到了一个结果
    if (sum == m) {
        ans = min(ans, cnt);
        return;
    }
    // 剪枝操作
    if (pos >= n || cnt >= ans || sum > m || sum + suf[pos] < m) return;
    // 对三种选择进行搜索
    dfs(pos + 1, sum + weights[pos], cnt);
    dfs(pos + 1, sum + weights[pos] / 2, cnt + 1);
    dfs(pos + 1, sum, cnt);
}

int main() {
    cin >> n >> m;
    m *= 2; // 总重量*2
    // 输入西瓜重量
    for (int i = 0; i < n; i++) {
        cin >> weights[i];
        weights[i] *= 2;
    }
    // 逆序排序
    sort(weights, weights + n, greater<int>());
    // 求重量后缀和
    for (int i = n - 1; i >= 0; i--) {
        suf[i] = suf[i + 1] + weights[i];
    }
    dfs(0, 0, 0);
    if (ans == INT8_MAX) {
        cout << -1;
    } else {
        cout << ans;
    }
    return 0;
}
2023第十四届蓝桥杯 C/C++ 大学生大赛 A 省赛是一个非常重要且具有挑战性的比赛。作为蓝桥杯系列赛事的一部分,这个比赛吸引了全国各地的大学生参与,旨在促进青学生计算机编程技术的提高,培养他们的创新能力和团队协作精神。 参赛者需要通过线上报名,在规定的时间内上传自己的比赛作品。比赛设置了一系列难度逐渐增加的编程目,要求选手运用C/C++语言进行编写和实现。这些目可能涉及算法设计、数据结构、编程基础等方面的知识,考察参赛者的编码能力、解决问的能力以及在压力下的应变能力。 在比赛中,选手不仅需要具备扎实的编程技术,还需要在有限的时间内迅速分析问、设计解决方案,并通过编程实现。因此,参赛者需要具备良好的逻辑思维能力、数学基础和编程实践经验。 在省赛中取得好成绩的选手将有机会晋级到全国赛,进一步与全国各地的顶尖选手一较高下,争夺更好的名次和更多的奖品。 参加蓝桥杯 C/C++ 大学生大赛不仅是一次锻炼和展示自己编程能力的机会,还能结识更多志同道合的同学和业界精英,获得丰厚的奖金和荣誉。同时,参赛经历对于大学生未来的学习和职业发展也具有积极的影响。 总之,2023第十四届蓝桥杯 C/C++ 大学生大赛 A 省赛是一个具有挑战性的比赛,参赛者需要具备扎实的编程技术和解决问的能力。通过参与比赛,学生可以提升自己的编程能力,拓宽视野,展示个人才华,并为未来的学习和就业打下坚实的基础。
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值