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 |