首页 > 编程语言 >C++U4-04-递推2

C++U4-04-递推2

时间:2023-11-14 12:45:06浏览次数:33  
标签:04 int U4 感染 cin C++ 折线 交点 递推

上节课作业部分(点击跳转)

 

排列组合

排列

 组合:

 

 练习题目

 题2

 编程题1,用递推求组合数

编程题3:

[【递推】直线分割平面问题]

【算法分析】
用 a[i] 表示 i 条直线最多能将这个圆分割成的部分数:
当 i=1 时,a[1]=2;
当 i=2 时,a[2]=4;
当 i=3 时,a[3]=7;
要分割成最多部分,则新加的直线要与之前的直线都要分别交于不同点。
当 i=4 时:
第 4 条直线要与前 3 条直线都要有不同的交点,
这 3 个交点构造出了 4 个部分(交点数 + 1)
a[4]=a[3]+交点数+1=a[3]+3+1=11;

当 i>=2 时, a[i]=a[i−1]+交点数+1,第 i 条直线和前 i−1 条直接都有不同的交点,且交点数为 i−1。得 a[i]=a[i−1]+i。

【参考代码】

include <iostream>

using namespace std;

const int N = 1e3 + 10; //a[i]:第i条直线最多能将 这个圆分割成的部分数
int a[N];

int main() {
int n;
cin >> n;
//初始条件 :1条直线最多可以将圆 分割成两部分
a[1] = 2;
for(int i = 2; i <= n; i++){
//a[i] = a[i - 1] + 交点数 + 1;
a[i] = a[i - 1] + i; //递推式
}
//输出 n 条直线最多能将这个圆分割成的部分数
cout << a[n];
return 0;
}

View Code

 

题4、

[【递推】折线分割平面问题]

本题可参考链接:https://www.cnblogs.com/ping2yingshi/p/12485742.html

【算法分析】
用 a[i] 表示 i 条折线最多能将平面分割成的部分数:
当 i=1 时,a[1]=2;
当 i=2 时,a[2]=7;

除了初始的点之外每一个交点都代表着一个新增的区域,求折线最大分割平面数也即折线带来的最大交点数

假设已知 a[i−1],对于第 i 条折线,折线中的每条线最多可以有 2∗(i−1) 个交点,折线转折处有 1 个交点,每一个交点会带来一个新区域,则递推公式为 a[i]=a[i−1]+4∗(i−1)+1。

【参考代码】

include <iostream>

using namespace std;

const int N = 10010;
int a[N];

int main() {
int c;
cin >> c;
a[1] = 2;
for (int i = 2; i <= 10000; i++) {
a[i] = a[i - 1] + 4 * (i - 1) + 1;
}
for (int i = 1; i <= c; i++) {
int n;
cin >> n;
cout << a[n] << endl;
}
return 0;
}

View Code

 

 

作业部分:

 

 

[蜜蜂路线]:

每个位置只能走到后1或后2,反过来例如5只能从4和3走过来,那么方案数也是就4的方案加3的方案数;

【算法分析】
求蜜蜂从 x 到 y 所有可能的方案数。
a 
i
​
  表示跨越 i 格的方案数。
从 1 到 2 可能的路径为:1->2,a[1] = 1;
从 1 到 3 可能的路径为: 1->2->3,1->3,a[2] = 2;
从 1 到 4 可能的路径为: 1->2->3->4,1->3->4,1->2->4,a[3] = 3;

得出爬 n 个格子的方案数为:a
i

= a
i−1

+ a
i−2

【参考代码】

include<iostream>

using namespace std;

const int N = 60;
long long a[N];

int main() {
int n;
cin >> n;
a[1] = 1; //初始条件:爬上1个格子的方案数
a[2] = 2; //爬上2个格子的方案数
for (int i = 3; i <= 50; i++) {
a[i] = a[i - 1] + a[i - 2]; //爬i个格子的方案数 = 爬i-1个格子的方案数 + 爬i-2个格子的方案数
}
while (n--) {
int x, y;
cin >> x >> y;
cout << a[y - x] << endl; //从x格到y格,爬上y-x个格子的方案数
}
return 0;
}

View Code 

[骨牌铺法]

f(i) = f(i-1)+f(i-2)

 

[流感传染]

【算法分析】
定义整型数组 a,下标从 1 开始存,防止越界。未被感染的置为 0,已被感染的置为 1,空的房子置为 −1。

m−1 天感染,遍历数组 a,为防止在这一轮中,感染后的人感染下一轮的人,将上一轮已被感染的人的邻居置为2。然后再次遍历数组 a, a[i][j] 等于 2 则置为 1。

m−1 天感染结束后,统计被感染人数,并输出。

【参考代码】

include<iostream>

using namespace std;

const int N = 110;
int a[N][N];

int main() {
int n, m, sum = 0;
cin >> n;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
char s;
cin >> s;
if (s == '.') a[i][j] = 0; //未被感染的
if (s == '@') a[i][j] = 1; //已被感染的
if (s == '#') a[i][j] = -1;//空的
}
}
cin >> m;
while (m > 1) { //m-1天
m--;
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (a[i][j] == 1) { //防止在这一轮中,感染后的人感染下一轮的人,将邻居置为2
if (a[i + 1][j] == 0) a[i + 1][j] = 2;
if (a[i - 1][j] == 0) a[i - 1][j] = 2;
if (a[i][j + 1] == 0) a[i][j + 1] = 2;
if (a[i][j - 1] == 0) a[i][j - 1] = 2;
}
}
}
for (int i = 1; i <= n; i++) { //这一轮被感染的人置为1
for (int j = 1; j <= n; j++) {
if (a[i][j] == 2) a[i][j] = 1;
}
}
}
for (int i = 1; i <= n; i++) {
for (int j = 1; j <= n; j++) {
if (a[i][j] == 1) sum++;
}
}
cout << sum;
return 0;
}

View Code

[求f(x,n)]

【算法分析】
定义浮点型数组 f,初始化为 x;
可以用递推的方法求出 f[n] 的值。
初始化:f[0]=x;
for 循环:开始:i = 1;结束:i <= n;变化:加 1。
递推式为:f[i] = sqrt(n - i + 1 + f[i - 1]);

【参考代码】

include <iostream>

include <cmath>

using namespace std;

double f[20];

int main(){
int x, n;
cin >> x >> n;
f[0] = x; //初始化
for(int i = 1; i <= n; i++){
f[i] = sqrt((n - i + 1) + f[i - 1]);
}
printf("%.2f",f[n]);
return 0;
}

View Code

 

 

标签:04,int,U4,感染,cin,C++,折线,交点,递推
From: https://www.cnblogs.com/jayxuan/p/17831346.html

相关文章

  • C++U5-05-广度优先搜索2
    广搜逻辑  广搜代码核心思路 广搜伪代码前面讲解的广度优先搜索案例都类似迷宫类的问题,但有些非迷宫类问题也可以使用广搜的思路解决[【广搜2】填涂颜色]【算法分析】可以在外面增加一圈0,然后从(0,0)位置开始广搜所有为0的位置,没有被搜索到且为0的......
  • Ubuntu18.04 打开终端报错: ERROR: ld.so: object ‘xxx.so‘ from LD_PRELOAD cannot
    1、问题现象在文件界面打开终端的时候,突然发现开头有一堆报错ERROR:ld.so:object'./envlib.so'fromLD_PRELOADcannotbepreloaded(cannotopensharedobjectfile):ignored.ERROR:ld.so:object'./libharfbuzz.so.0'fromLD_PRELOADcannotbepreloaded(cannotope......
  • XPT2046
    XPT2046是一种典型的逐次逼近型模数转换器(SARADC),包含了采样/保持、模数转换、串口数据输出等功能。(采样:将一个时间上连续变化的模拟量转化为时间上离散的变化量。 保持:将采样结果存储起来,知道下次采样。 数模转换包含量化和编码。量化:将采样电平归化与之接近的离散数字电平......
  • 单例模式C++实现
    单例模式全局静态变量实现饿汉式单例模式饿汉式实现方式是线程安全的。黑#includeusingnamespacestd;/*饿汉式单例模式*/classSingleObject{private:staticSingleObjectinstance;SingleObject(){std::cout<<"Singleton......
  • C++模拟键盘操作
    前言:C++/C语言模拟键盘操作十分的黑科技啊,作者也是借鉴了C/C++模拟键盘操作(一)_折竹丶的博客-CSDN博客_c++模拟键盘​​​​​​​​​​​​​​  来做一个小小的全面总结,有兴趣可以去看原创 键盘操作:在C++中有一个头文件:windows.h我们可以尝试导入他: #include<......
  • C++ Primer学习笔记——第十一章
    第十一章关联容器前言关联容器和顺序容器有着本质的不同:关联容器中的元素是按关键字来保存和访问的。与之相对,顺序容器中的元素是按它们在容器中的位置来顺序保存和访问的。(MySQL中元素就是按照关联容器进行保存)关联容器支持高效的关键字查找和访问。两个主要的关联容器(assoc......
  • C++多态
    1、静态多态(1)函数重载 函数重载以参数的类型或数量不同来区分不同用途的同名函数。不以返回值不同来区分函数。编译器在调用函数时会在意函数的参数,不会在意函数的返回值。intmyAdd(inta,intb);floatmyAdd(doublea,doubleb);(2)运算符重载 使用关键字operator来......
  • (链表)04-合并两个排序的链表
    /*publicclassListNode{intval;ListNodenext=null;ListNode(intval){this.val=val;}}*/publicclassSolution{publicListNodeMerge(ListNodelist1,ListNodelist2){//添加头节点ListNoderoot=ne......
  • C/C++知识补充
    运算符算术运算符关系运算符逻辑运算符位运算符赋值运算符杂项运算符运算符描述实例+把两个操作数相加A+B将得到30-从第一个操作数中减去第二个操作数A-B将得到-10*把两个操作数相乘A*B将得到200/分子除以分母B/A将得到......
  • Linux Ubuntu部署C++环境与VS Code编辑器
      本文介绍在LinuxUbuntu操作系统下,配置VisualStudioCode软件与C++代码开发环境的方法。  在文章VMware虚拟机中安装LinuxUbuntu操作系统中,我们介绍了LinuxUbuntu操作系统的下载、安装方法;本文则基于前述基础,继续介绍在LinuxUbuntu操作系统中配置VisualStudioCode软......