【C++笔试强训】如何成为算法糕手Day11

学习编程就得循环渐进,扎实基础,勿在浮沙筑高台

循环渐进Forward-CSDN博客

目录

游游的水果大礼包

思路

代码实现:

买卖股票的最好时机(二)

思路:

代码实现:

倒置字符串

思路:

代码实现:

游游的水果大礼包

牛客网做题链接:游游的水果大礼包 (nowcoder.com)

思路

面对这样一个问题------给定一定数量的苹果和桃子,以及两种不同价值组合方式的礼包(一号礼包和二号礼包),目标是最大化所能组成的礼包总价值。这个问题不能简单地通过贪心算法解决,因为不同礼包的价值和所需资源比例可能不同,导致无法直接选择价值最高的礼包无限制地组合。

因此,需要采取一种更全面的搜索策略,即枚举法(也称为蛮力法)。这种方法的核心思想是尝试所有可能的礼包组合方式,并记录其中总价值最高的组合。具体步骤如下:

  1. 初始化:设定一个变量来记录当前找到的最大总价值。

  2. 枚举过程

    • 从一号礼包选择0个开始,逐渐增加一号礼包的数量,同时相应地减少二号礼包的数量,以保持苹果和桃子的总数不变。
    • 对于每一种一号礼包和二号礼包的组合数量,计算当前组合的总价值。
    • 如果当前组合的总价值大于之前记录的最大总价值,则更新最大总价值。
  3. 结束条件:当一号礼包的数量增加到无法再增加(即使用了所有可用的苹果和桃子),或者二号礼包的数量减少到0时,枚举过程结束。

  4. 返回结果:返回记录的最大总价值。

这种方法虽然直观且能够找到最优解,但其时间复杂度较高,特别是在苹果和桃子的数量以及礼包种类较多时。然而,在没有更高效的算法可以利用问题特定结构的情况下,枚举法是一个可靠的选择。

代码实现:

复制代码
#include <iostream>
using namespace std;
long long n, m, a, b;
int main()
{ 
    cin >> n >> m >> a >> b;
    long long ret = 0;
    for(long long x = 0;x <= min(n/2,m);x++)
    {
        long long y = min(n-x*2,(m-x)/2);
        ret = max(ret,a*x+b*y);
    }
    cout << ret << endl;
     return 0;
}

买卖股票的最好时机(二)

牛客网做题链接:买卖股票的最好时机(二)_牛客题霸_牛客网 (nowcoder.com)

思路:

典型的动态规划题目,

dp:每一天的状态有两种,一种是买入 ,一种是卖出。对于买入来说又有两种: 一种昨天就是买入状态,今天不卖出还是买入状态;另一种是昨天是卖出状态,今天就可以重新买入。对于卖出也是一样的: 一种昨天就是卖出状态,今天不买入还是卖出状态;另一种是昨天是买入状态,今天就可以进行卖出。这样有两个状态的,可以用两个数组来分别表示,并且状态转移方式根据上面的变化也可以很容易的写出。

代码实现:

复制代码
#include <iostream>
using namespace std;
#include <vector>
int main() {
    int n;
    cin >> n;
    vector<int> nums(n);
    for (int i = 0; i < n; i++)
        cin >> nums[i];
        
    vector<int> f(n), g(n);
    f[0] = -nums[0];
    for (int i = 1; i < n; i++) 
    {
        f[i] = max(f[i - 1], g[i - 1] - nums[i]);
        g[i] = max(g[i - 1], f[i - 1] + nums[i]);
    }
    cout << g[n - 1];
    return 0;
}

倒置字符串

牛客网做题链接:倒置字符串_牛客题霸_牛客网 (nowcoder.com)

思路:

不调用C++库函数reverse,将整串字符串逆置6,再将每个单词进行逆置

代码实现:

复制代码
#include <iostream>
using namespace std;
#include <string>
void Reverse(string& s, int left, int right) 
{
    while (left < right) 
    {
        swap(s[left++], s[right--]);
    }
}
int main() 
{
    string s;
    getline(cin, s);
    Reverse(s, 0, s.size() - 1);
    int left = 0, right = 0;
    while (right < s.size()) 
    {
        while (right < s.size() && s[right] != ' ') right++;
        Reverse(s, left, right - 1);
        left = right + 1;
        right = left;
    }
    cout << s;
    return 0;
}

学习编程就得循环渐进,扎实基础,勿在浮沙筑高台

相关推荐
机器学习之心1 分钟前
198种组合算法+优化TCN-Transformer+SHAP分析+新数据预测+多输出!深度学习可解释分析,强烈安利,粉丝必备!
深度学习·算法·transformer·shap分析·新数据预测
狐572 分钟前
2026-01-12-LeetCode刷题笔记-1266-访问所有点的最小时间.md
笔记·算法·leetcode
UpgradeLink2 分钟前
基于 Go 打造的升级链路管理平台:upgradelink 让设备升级更简单
开发语言·后端·golang
Gorgous—l2 分钟前
数据结构算法学习:LeetCode热题100-栈篇(有效的括号、最小栈、字符串解码、每日温度、柱状图中最大的矩形)
数据结构·学习·算法
小郭团队4 分钟前
教育公平的探索
大数据·人工智能·嵌入式硬件·算法·硬件架构
天府之绝4 分钟前
uniapp 中使用uview表单验证时,自定义扩展的表单,在改变时无法触发表单验证处理;
开发语言·前端·javascript·vue.js·uni-app
瑞雨溪8 分钟前
力扣题解:740.删除并获得点数
算法·leetcode·职场和发展
LeeeX!10 分钟前
基于YOLO11实现明厨亮灶系统实时检测【多场景数据+模型训练、推理、导出】
深度学习·算法·目标检测·数据集·明厨亮灶
红队it12 分钟前
【Spark+Hadoop】基于spark+hadoop游戏评论数据分析可视化大屏(完整系统源码+数据库+开发笔记+详细部署教程+虚拟机分布式启动教程)✅
大数据·hadoop·分布式·算法·游戏·数据分析·spark
程序员-King.12 分钟前
day125—二分查找—寻找峰值(LeetCode-162)
算法·leetcode·职场和发展