算法分析与设计--实验2

文章介绍了多个编程题目,涉及传染病传播的递推计算、台阶问题的动态规划解决方案、数的计算的递推规律、数的划分的动态规划方法、绝对值最小和的双重循环查找、区间和的预处理求和技巧、二分查找在数列查询中的应用,以及比给定数大的数的数量统计。每个问题都给出了相应的解题思路和代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

A.动物的传染病

B.台阶问题

C.数的计算

D.数的划分

E.绝对值最小的和

F.区间和

G.二分查找

H.比k大的数

A.动物的传染病

Description
动物患传染病了。一个动物会每轮传染 x 个动物。试问 n 轮传染后有多少动物被传染?
Input
两个非负整数 x 和 n。
Output
一个整数,即被传染的动物数。
Sample Input
10 2
Sample Output
121

本题使用递推,一个循环结束。核心代码如下:

long long Solve(int x,int n)
{
    long long sum=1;
    for (int i=1;i<=n;i++)
    {
        sum=sum+sum*x;
    }
    return sum;
}

B.台阶问题

Description
有 N 级的台阶,你一开始在底部,每次可以向上迈最多 K 级台阶(最少 1 级),问到达第 N 级台阶有多少种不同方式。
Input
两个正整数N,K。1 ≤  N ≤ 10 6, 1 ≤  K ≤ 20
Output
一个正整数,为不同方式数,由于答案可能很大,你需要输出 ans mod 100003 后的结果。
Sample Input
5 2
Sample Output
8
Hint
N级台阶的情况可以由 N-K ~ N-1 这些台阶的情况得到

根据提示我们可以得到这样的递推关系:a[n]=a[n-1]+a[n-2]+……+a[n-k] ,注意每次都要取模。

外层循环可以理解为计算走到第i阶台阶需要的步数,内层循环则计算递推公式,从i-1阶加到i-k阶。

代码借鉴了这位大佬的:走台阶(每次最多迈k级)C++_n层楼梯每次k步_!Polaris的博客-优快云博客

#include <iostream>
using namespace std;
int n, k;
int ans[1111111];
const int mod = 100003;
int main() {
    for (int i = 0; i < 1111111; i++)
        ans[i] = 0;
    ans[0] = 1;
    while (cin >> n >> k)
    {
        for (int i = 1; i <= n; i++)
        {
            for (int j = 1; j <= k; j++)
            {
                if (i - j >= 0)
                {
                    ans[i] += ans[i - j];
                    ans[i] %= mod;
                }
            }
        }
        cout << ans[n] << endl;
    }
    return 0;
}

C.数的计算

Description
给定一个初始序列,序列中仅包含一个元素 n(1≤ n≤1000)。重复以下步骤:
不做任何处理;
在序列的最左边插入一个正整数,但是这个正整数不能超过序列当前首元素的一半;
请问通过这样的规则,可以构造出多少个不同的序列。
Input
1 个正整数 n ( n ≤ 1000 )
Output
1 个整数,表示能够生成的序列个数。
Sample Input
6
Sample Output
6
Hint
当n=6,满足条件的序列为
{6},
{1, 6},
{2, 6},
{1, 2, 6},
{3, 6},
{1, 3, 6}

本题可以采取和B题类似的思路用双重循环去做(据题得递推公式:a[i]=1+a[1]+a[2]+...+a[i/2]),但是还有一种更简单的方法:首先我们根据题意列举出一些例子,如下表:

输入:n

输出:a[n]

1

1

2

2

3

2

4

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值