c++基础算法练习(1)

1、每个判断条件return 0返回:

在这里插入图片描述

        if (savings >= house_price) { // 检查是否够买房子
            cout << years + 1 << endl; // 输出年数,+1因为years从0开始
            return 0; // 成功找到结果,退出程序
        }

2、裴波那契数列

在这里插入图片描述

动态规划(Dynamic Programming,简称DP)是一种数学方法和算法设计思想,主要用于求解复杂问题。它的核心思路是将原问题分解为相对简单的子问题,通过逐步解决这些子问题来达到最终目标。这种方法在多个领域有广泛应用,包括计算机科学、经济学、运筹学、管理学和生物信息学等

1、重叠子问题:
动态规划适用于那些可以分解成重复的子问题的问题。例如,在计算 Fibonacci 数列时,F(n) 可以通过 F(n-1) 和 F(n-2) 来表示,这样就形成了重叠的子问题。
2、最优子结构:
若一个问题的最优解包含其子问题的最优解,则该问题具有最优子结构性质。动态规划将此性质作为设计迭代或递归算法的基础。
3、记忆化存储:
为了避免重复计算动态规划中已解决的子问题,将它们的结果存储在某种数据结构中(如数组或哈希表)。这样,当再次需要这些子问题的结果时,可以直接查找而无需重新计算,从而显著提高效率。

#include <iostream>
using namespace std;
/*
输入项数
终止是1,2
*/
int feibo(int n) {
    if (n == 1 || n == 2) {
        return 1;
    }
    int a = 1, b = 1; // F(1) 和 F(2)
    for (int i = 3; i <= n; ++i) {
        int c = a + b; // F(n) = F(n-1) + F(n-2)
        a = b; // 更新 F(n-2)
        b = c; // 更新 F(n-1)
    }
    return b; // 返回 F(n)
}

int main() {
    int N;
    cin >> N ;
    //if()
    cout<<feibo(N);
    return 0;
}

3、鸡尾酒疗法

在这里插入图片描述

1、数组里面的变量用double

#include <iostream>
#include <vector>

using namespace std;

int main() {
    int N;
    cin >> N; // 输入组数

    vector<double> sequ(N, 0); // 存储各疗法的有效率
    for(int i = 0; i < N; ++i) {
        int x, y;
        cin >> x >> y; // 输入总病例数和有效病例数
        double residue = 100.0 * y / x; // 计算有效率
        sequ[i] = residue; // 存储有效率
    }
    
    // 比较每个改进疗法与鸡尾酒疗法的效果
    for(int i = 1; i < N; ++i) {
        if (sequ[i] - sequ[0] > 5) {
            cout << "better" << endl; // 效果更好
        } else if (sequ[0] - sequ[i] > 5) {
            cout << "worse" << endl; // 效果更差
        } else {
            cout << "same" << endl; // 效果差不多
        }
    }

    return 0;
}

4、球弹跳高度的计算

在这里插入图片描述

1、这里的最后一次不要计算反弹的高度,要减去

1printf("%g\n", totalDistance)
//自动选择格式:%g 会根据数值的大小自动选择使用 f(浮点数)或 e(科学记数法)格式来输出。
#include <iostream>
#include <cstdio>
using namespace std;

int main() {
    double h, totalDistance = 0;
    cin >> h; // 输入初始高度
    double reboundHeight;

    for (int i = 0; i < 10; ++i) {
        totalDistance += h;  // 落下的距离
        reboundHeight = h / 2; // 计算反弹高度
        if(i!=9)
        {
         totalDistance += reboundHeight; // 加上反弹的距离
        }

        h = reboundHeight; // 更新高度为反弹高度
    }
    

    // 输出结果
    printf("%g\n", totalDistance); // 总经过的米数
    printf("%g\n", reboundHeight); // 第10次反弹的高度

    return 0;
}

5、角谷猜想

在这里插入图片描述

1、这里面要用到的值都需要反复更新
#include <iostream>
#include <cstdio>
using namespace std;

int main() {
    int n;
    cin >> n; // 输入正整数

    // 继续处理直到 n 等于 1
    while (n != 1) {
        if (n % 2 == 0) { // 偶数
            n = n / 2; // 更新 n
            printf("%d/%d=%d\n", n * 2, 2, n); // 显示除法过程
        } else { // 奇数
            n = n * 3 + 1; // 更新 n
            printf("%d*%d+%d=%d\n", (n - 1) / 3, 3, 1, n); // 显示乘法和加法过程
        }
    }
    cout << "End" << endl; // 输出结束标志
    return 0;
}

6、计分程序

在这里插入图片描述

1、按照题思路解题

#include <iostream>
using namespace std;

int calculateScore(int N) {
    int score = 0;
    
    if (N <= 10) {
        score = N * 6; // 前 10 道题,每道 6 分
    } else if (N <= 20) {
        score = 10 * 6 + (N - 10) * 2; // 前 10 道 6 分,后 N-10 道 2 分
    } else if (N <= 40) {
        score = 10 * 6 + 10 * 2 + (N - 20) * 1; // 前 20 道题按上述得分,后 N-20 道 1 分
    } else {
        score = 100; // 超过 40 道题,得 100 分
    }
    
    return score;
}

int main() {
    int N;
    while (cin >> N) { // 接收多组输入
        cout << calculateScore(N) << endl; // 输出每个学生的得分
    }
    return 0;
}

6、药房管理

在这里插入图片描述

#include <iostream>
#include <vector>

using namespace std;

int main() {
    int m; // 药品总量
    int n; // 病人数
    
    // 输入药品总量
    cin >> m;
    // 输入病人数
    cin >> n;

    vector<int> requests(n); // 用于存储每个病人的取药请求

    // 输入每个病人的请求数量
    for (int i = 0; i < n; ++i) {
        cin >> requests[i];
    }

    int not_satisfied_count = 0; // 未能取药的病人数

    // 遍历每个病人的请求
    for (int i = 0; i < n; ++i) {
        if (requests[i] <= m) { // 库存足够
            m -= requests[i]; // 扣除库存
        } else { // 库存不足
            not_satisfied_count++; // 记录未满足请求的病人
        }
    }

    // 输出未能取药的人数
    cout << not_satisfied_count << endl;

    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

week_泽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值