• 【笔试训练】day11


    1.游游的水果大礼包

    思路:

    枚举。假设最后的答案是x个a礼包,y个b礼包,得到一个式子:ans=a*x+b*y

    我们可以枚举x的数量,这样就能变相的把y的求出来。呃这就是鸡兔同笼问题嘛

    x最大的范围是多少呢?也就是a礼包最多能做多少个,即min(n/2,m)

    代码:

    1. #define _CRT_SECURE_NO_WARNINGS 1
    2. #include
    3. using namespace std;
    4. typedef long long LL;
    5. int main() {
    6. int n, m, a, b;
    7. cin >> n >> m >> a >> b;
    8. int k1 = min(n / 2, m);
    9. LL ans = 0;
    10. for (int i = 0; i <= k1; i++) {
    11. int nn = n - i * 2;
    12. int mm = m - i;
    13. int k2 = min(nn, mm / 2);
    14. ans = max(ans, (LL)a * i + b * k2);
    15. }
    16. cout << ans << endl;
    17. return 0;
    18. }

    2.买卖股票的最佳时机(二)

    思路:

    先求简单版本,再去看进阶。

    首先是简单版本:用dp[i][0]表示第i天过后手里没有股票的最大收益,用dp[i][1]表示第i天过后手里有股票的最大收益.

    对于第i天的状态一共有两个:

    - 第i天过后手里没有股票的情况

        第i天没有股票,有可能第i-1天有股票,但是今天卖掉了,收益+a[i],也有可能第i-1天也没有股票。

       根据题意,这两种情况取一个最大值。所以dp[i][0]=max(dp[i-1][1]+a[i],dp[i-1][0])

    - 第i天过后,手里有一支股票 .

        第i天有股票,有可能是第i-1天没有股票,今天买的,所以收益-a[i].也有可能第i-1天有股票,但是今天不卖。

         根据题意,这两种情况取一个最大值。所以dp[i][1]=max(dp[i-1][0]-a[i],dp[i-1][1])

    最后的答案是dp[n][0]

    代码1:

    1. #include
    2. using namespace std;
    3. const int N = 1e5 + 10;
    4. int dp[N][2];
    5. int a[N];
    6. int main() {
    7. int n;
    8. cin >> n;
    9. for (int i = 1; i <= n; i++)cin >> a[i];
    10. dp[1][0] = 0;
    11. dp[1][1] = -a[1];
    12. for (int i = 2; i <= n; i++) {
    13. dp[i][0] = max(dp[i - 1][1] + a[i], dp[i - 1][0]);
    14. dp[i][1] = max(dp[i - 1][0] - a[i], dp[i - 1][1]);
    15. }
    16. cout << dp[n][0];
    17. return 0;
    18. }

     再来思考进阶。

    进阶是要求空间复杂度为O(1),说明一个数组都不能开。也意味着,我们必须边读入边处理。

    但是根据朴素版本的代码,我们可以知道,其实对于第i天的状态,它只会被第i-1天的状态影响。

    于是我们可以用两个变量分别表示第i-1天的有票和没票的状态。再用两个变量表示第i天的有票和没票的状态。

    每过一天,我们就迭代一下每一天的状态。

    于是化简状态转移方程得:

    1. a2 = max(b1 + x, a1);
    2. b2 = max(a1 - x, b1);
    3. a1 = a2;//迭代
    4. b1 = b2;

    a2就表示dp[i][0],a1表示dp[i-1][0],b1,b2同理。

    代码1:

    1. #include
    2. using namespace std;
    3. int main() {
    4. int n;
    5. cin >> n;
    6. int x;
    7. int a1 = 0;
    8. int a2 = 0;
    9. int b1 = 0;
    10. int b2 = 0;
    11. cin >> b1;
    12. b1 = -b1;//初始化第一天
    13. for (int i = 2; i <= n; i++) {
    14. cin >> x;
    15. a2 = max(b1 + x, a1);
    16. b2 = max(a1 - x, b1);
    17. a1 = a2;//迭代
    18. b1 = b2;
    19. }
    20. cout << a2 << endl;
    21. return 0;
    22. }

    3.倒置字符串

    思路:

    首先就是不要考虑什么标点,这是假信息。

    剩下得就是简单的反转字符串,再反转每个单词。数据也小,随便暴力。

    代码:

    1. #include
    2. #include
    3. #include
    4. #include
    5. using namespace std;
    6. int main() {
    7. string str;
    8. getline(cin, str);
    9. string ans;
    10. int n = str.size();
    11. reverse(str.begin(), str.end());
    12. for (int i = 1, j = 0; i < n; i++) {
    13. if ((str[i] == ' ' && str[i - 1] != ' ') || i == n - 1) {
    14. string t = "";
    15. if (i != n - 1) {
    16. t = str.substr(j, i - j);
    17. } else {
    18. t = str.substr(j, i - j + 1);
    19. }
    20. reverse(t.begin(), t.end());
    21. ans += t;
    22. ans += ' ';
    23. j = i + 1;
    24. }
    25. }
    26. cout << ans << endl;
    27. return 0;
    28. }

  • 相关阅读:
    Java 程序员面试要准备哪些?
    非零基础自学Java (老师:韩顺平) 第10章 面向对象编程(高级部分) 10.8 接口
    最大连续1的个数-力扣485-Java
    TypeScript小状况之选且只选一个
    Java中String转List和List转String四种方法
    XML|DTD声明
    java毕业设计房屋合租系统Mybatis+系统+数据库+调试部署
    Spring源码:Bean生命周期(终章)
    react antd实现upload上传文件前form校验,同时请求带data
    C#编程学习
  • 原文地址:https://blog.csdn.net/qq_62987647/article/details/138201634