Coding Practice,48天强训(11)

Topic 1:游游的水果大礼包

之前一直写了丢在草稿箱忘整理发出来了,这两天第三周的强训恢复,把博文都发出来。

这题刚开始做的时候还想用贪心,看ab哪个价值高就尽量多选,做半天做不出来,因为实际是只考虑了极端情况,举个例子,当有2个苹果,100个桃子,苹果礼包3块,桃子礼包2块;此时按贪心策略应该先选苹果礼包,就只能做1个,总价值3块,但选桃子礼包就能做2个,总价值4块;能很快的举出反例。最直观暴力的做法还是枚举:

#include <iostream>
#include <algorithm>
using namespace std;

int main() 
{
    long long n, m, a, b;
    cin >> n >> m >> a >> b;//n苹果,m桃子,a苹果多礼包,b桃子多礼包

    long long res = 0;// 礼包最大的价值
    long long max_a = min(n / 2, m);  // a在[0,min(n/2, m)]这个区间中,最大值就是min(n/2, m)


    for (long long x = 0; x <= max_a; ++x)// 从0到a的最大可能值,遍历a礼包的个数
    {
        long long y = min(n - 2 * x, (m - x) / 2);//a礼包确定个数后剩下的b礼包个数在n-2x和(m-x)/2中取小
        y = max(y, 0LL);  // 确保 y 非负
        res = max(res, a * x + b * y);
    }

    cout << res << endl;
    return 0;
}

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

这题的解法在(一)里已经分析过了,拿出来用用

收集所有的红色涨停段的收益,即可获取最终收益,这是贪心的思路,恭喜你炒股大师!永远是低买高抛!

class Solution {
public:
    int maxProfit(vector<int>& prices) 
    {
        int res = 0;
        for(int i = 1; i < prices.size(); ++i)
        {
            if(prices[i] > prices[i - 1])
            {
                res += prices[i] - prices[i - 1];
            }
        }
        return res;
    }
};

这一题还有动态规划的解法,是较为通用的,可以解决股票买卖这一系列的算法问题,最近太忙了先不写了,之后跟着代码随想录二刷补上


Topic 3:倒置字符串

这都不是算法严格来说,属于实用场景考察,基本功,215天前用C做过,现在用C++再试试

#include <stdio.h>
#include <string.h>
#include <assert.h>

void reverse(char* left, char* right)
{
    assert(left);
    assert(right);
    
    while(left < right)
    {
    char tmp = *left;
    *left = *right;
    *right = tmp;
    left++;
    right--;
    }
}

int main() 
{
    char arr[101] = {0};
    gets(arr);//I like beijing.
    int len = strlen(arr);
    reverse(arr, arr + len -1);

    char* start = arr;

    while(*start)
    {
        char* end = start;
        while(*end != ' ' && *end != '\0')
        {
            end++;
        }
        reverse(start, end-1);
        if(*end != '\0')
        {
            end++;
        }
        start = end;
    }
    printf("%s\n", arr);
    
    return 0;
}

C++,用个容器加个反向迭代器,成长,很神奇吧

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;

int main() 
{
    vector<string> v;
    for(string s; cin >> s; v.push_back(s));// 循环将每个词分别输入到容器里,空格会分割单词
    for(auto it = v.rbegin(); it != v.rend(); ++it)// 反向迭代器遍历
    cout << *it << (it == v.rend() - 1 ? "" : " ");// 不到尾部就打印空格,到尾部就不打
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值