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 ? "" : " ");// 不到尾部就打印空格,到尾部就不打
}
344

被折叠的 条评论
为什么被折叠?



