今日刷题集合

月考没考,最皮的是刷题效率低的可怕,搜索中的那些回溯用的还是很水,不如总结一下。

codevs 题号:1501 1506 1842 1983 2549 2806 3143 3145 1008 1294 1295

1501 二叉树的最大宽度和高度(没加using namespace std ;会过不去编译,max、min函数封装在#include<iostream>里,所以没有using namespace std ;不行。)

 1 #include<bits/stdc++.h>
 2 int q[20][3] , w , h , s[20];
 3 void dfs(int n , int k )
 4 {
 5     s[k] ++ ;//该层宽度
 6     h = max(h,k);//高度
 7     if(a[n][0]) dfs(a[n][0],k+1);//如果左儿子存在,向左搜
 8     if(a[n][1]) dfs(a[n][1],k+1);//右儿子存在,向右搜。
 9     return ;
10 }
11 int main ()
12 {
13     int a;
14     scanf("%d",&a);
15     for(int i = 1 ; i< = a ; i ++)
16         scanf("%d%d",&q[i][0],&q[i][1]);//存入这棵树
17     dfs(1,1);//从头(1,1)搜
18     for(int i = 1 ; i <= 19 ; i ++)
19         w = max(w,s[i]);//找出最大宽度
20     printf("%d%d",w,h);//输出最大宽度和高度
21     return 0 ;
22 }

1506 传话(其实这倒是一道图论题,用flody做的dp题,但是不知道为什么codevs上写的是搜索,事实上搜索可做。但是很麻烦(dalao、神牛、神犇请自动忽略这句话))

 1 #include<bits/stdc++.h>
 2 int n , m , flag;
 3 bool f[1001][1001] , q[1001][1001];
 4 void dfs(int x , int y)
 5 {
 6     if(flag) return ;//如果可以传回来直接return。
 7     if(f[x][y]){//如果可以往下一步走,就把flag制为1。
 8         flag = 1 ;
 9         return ;
10     }
11     for(int i =1 ; i <= n ; i ++)
12         if(f[x][i] && !q[x][i]){//判断这个点往下能不能走,走没走过
13             q[x][i] = 1;//走过了制为1,防止重复地走。
14             dfs(i ,y);//这个i是下一个点的数
15         }
16     return ;
17 }
18 int main()
19 {
20     scanf("%d%d",&n,&m);
21     int a , b ;
22     for(int i = 1 ; i <= m ; i ++){
23         scanf("%d%d",&a,&b);
24         f[a][b] = 1 ; //类似图论的邻接矩阵中,两个认识就把两点之间制为1。
25     }
26     for(int i = 1 ; i <= n ; i ++){
27         flag = 0 ;
28         memset(q,0,sizeof(q));
29         dfs(i,i);//一共有几次就搜索几次
30         if(flag) printf("T\n");
31         if(!flag) printf("F\n"); //一定要加\n不然真的花式翻车。
32     }
33     return 0 ;
34 }

1842 递归第一次(有一点像搜索,算是子程序递归吧(似乎搜索就是这个)看着玩玩)

 1 #include<cstdio>
 2 #include<cmath>
 3 #include<iostream>
 4 using namespace std ;
 5 int F(int n)
 6 {
 7     if(n>=0)
 8         return 5 ;
 9     else if (n<0)
10         {
11             return F(n+1)+F(n+2)+1;
12         }
13 }
14 int main()
15 {
16     int n;
17     cin>>n;
18     printf("%d\n",F(n));
19     return 0;
20 }

1983 等式问题

 1 #include<bits/stdc++.h>
 2 long long a ,ans ;
 3 void dfs(int sum , int step){
 4     if(step == 10){
 5         if(sum == a) ans ++;//处理算出来的数据,然后回溯
 6         return ;
 7     }
 8     for(int i = step ;i  <= 9 ; i ++)
 9         {
10             int t = 0 ;
11             for(int j =step ; j <= i ; j ++)
12                 t = t * 10 + j ;//中间不加符号
13             dfs(sum + t , i + 1);//搜索下一步
14             if(step>1) dfs(sum-t,i-1);//回溯
15         }
16 }
17 int main()
18 {
19     int a;
20     scanf("%lld",&a);
21     dfs(0,1);//目前和为0,是第一步。
22     printf("%lld",ans);
23     return 0 ;
24 }

2549 自然数和分解

 1 #include<bits/stdc++.h>
 2 int a , ans ;
 3 void dfs(int x, int num)
 4 {
 5     if(x == 0) {ans ++ ; return ;}//这个题是反向思维逻辑,所以x能被剪到0也就可以证明自然数和已经分解了
 6     for(int i = num ; i <= a ; i ++)
 7         if(x-i>=0) dfs(x-i,i);//如果还能作差的话,往下搜。
 8 }
 9 int main ()
10 {
11     scanf("%d",&a);
12     dfs(a,1);//进入子程序的是这个数和第一个作差的数1.
13     printf("%d",ans);
14     return 0 ;
15 }
16  

拖更2806 3143 3145 1008 1294 1295

还有155天初赛, 还有183天复赛。

那是我愿意付诸一生的人,现在却没法拥有。

时间: 2024-10-14 00:59:00

今日刷题集合的相关文章

今日刷题总结21

C++的内存分配方式 之前有说过C++的内存分为5部分,即栈.堆.全局/静态存储区.自由存储区以及常量存储区. 栈:栈由编译器自动分配与释放,它用来存储函数的参数值以及局部变量. 堆:堆由应用程序分配与释放,应用程序使用malloc在堆上获取内存,使用free释放内存.如果应用程序获取内存后没有释放,就会造成内存泄漏,在应用程序终止时泄漏的内存才会被操作系统回收. 自由存储区:自由存储区是C++中基于new和delete的抽象概念.当应用程序使用new分配内存时,就说该内存是自由存储区.C++编

今日刷题总结7

内联函数 内联函数是由inline关键字修饰.在类内定义的函数默认为内联函数.从源代码的层面上看,内联函数有函数的结构,而在编译后,却不具备函数的性质.内联函数不是在调用时发生控制转移,而是在编译时将函数体嵌入在每一个调用处,这类似于宏替换,使用函数体替换调用处的函数名.能否形成内联函数,需要看编译器对该函数定义的具体处理. 内联函数的主要作用是用来消除函数调用时的时间开销.它通常用于频繁执行的函数,对于小内存空间的函数非常受益. 使用内联函数的时候要注意: (1)递归函数不能定义为内联函数 (

今日刷题总结3

稳定排序 (1)冒泡排序:冒泡排序就是把小的元素往前调或者把大的元素往后调.比较是相邻的两个元素比较,交换也发生在这两个元素之间.如果两个元素相等,不用进行交换:所以冒泡排序是一种稳定排序算法. (2)归并排序 :归并排序是把序列递归地分成短序列,递归出口是短序列只有1个元素或者2个序列(1次比较和交换),然后把各个有序的短序列合并成一个有序的长序列,不断合并直到原序列全部排好序.在1个或2个元素时,1个元素不会交换,2个元素如果大小相等也不进行交换.在短的有序序列合并的过程中可以保证如果两个当

今日刷题总结9

数据存取路径 数据存取是指数据库数据存贮组织和存贮路径的实现和维护.在计算机中,数据一般以文件形式保存或存放在数据库中.在数据库,数据存取路径分为主存存取路径与辅存存取路径,前者主要用于主键检索,后者用于辅助键检索.在系统中,路径一般分为相对路径和绝对路径. 数据存取路径是指存取数据的位置,由于程序运行具有局部性,不可能把所有数据都调入内存,在内存中只有一部分数据,其余数据都在外存,因此数据存取路径分为辅存存取路径和内存存取路径,不同的路径,查找的方法是不同的,一般分为内存查找和辅存查找. 内存

今日刷题总结17

拥塞控制方法 (1)慢开始和拥塞避免 发送方维持一个拥塞窗口cwnd的状态变量,开始时cwnd的大小为一个最大报文段长度MSS.发送方发送完窗口内所有报文段后,每收到一个新的对已发送报文段的确认,就把cwnd增加至多一个MSS.以下说明了慢开始与拥塞避免的原理,其中cwnd的大小用MSS的个数来衡量. 最初发送方设置cwnd=1,发送第一个报文段M1,收到对M1的确认后,cwnd从1增大为2,然后发送方接着发送cwnd中的M2和M3两个报文段,接收方接收后对M2和M3确认.发送方每接收到一个对已

今日刷题总结19

共享区域与私有区域 每个进程都有自己的私有虚拟地址空间,避免了受到其他进程的错误读写.但是,通常的c程序几乎都使用到标准库函数,例如printf或者scanf,如果每个进程都要为这些常用库函数在物理内存保留一份拷贝,这样对内存就非常浪费了. 为了解决上述问题,可以将常用库函数设定为共享对象,共享对象在物理内存上只有一份拷贝,多个进程可以把自身虚拟内存的一个区域映射到该共享对象上,这些区域就叫共享区域,如果一个进程在自己的共享区域进行写操作,在其他进程的共享区域内能看到相应的改变,并且这种改变也会

今日刷题总结15

TCP滑动窗口 假设A向B发送数据,A收到了B的确认报文,报文首部的窗口值为20,确认号ack=31,这表示B已经收到了截止序列号30的所有数据,根据窗口值和确认号,A构造出自己的发送窗口,如下图所示. A的发送窗口表示在没有收到B的确认下可以联系把窗口内的数据发送出去.对于已经发送出去的数据,在没有接到确认时,必须暂时驻留在发送窗口内以便在超时重传时使用.发送窗口后沿的后面部分是已经发送并得到确认的数据,这些数据不再保留到发送窗口内.发送窗口前沿的前面部分是不允许发送的数据,因为接受方B的接收

今日刷题总结2

度 在无向图中每个节点所连边的条数就是该节点的度数. 在有向图图中,指向该节点的边的条数称为入度,反之称为出度.有向图的度是出度与入度之和. 在树中,节点的子女个数称为节点的度. DHCP协议 dhcp是一个局域网的网络协议,是基于udp协议工作的,主要用于集中管理和分配ip地址,使网络中的主机动态地获得ip地址.网关地址.dns服务器地址等,提升地址的使用率.dhcpv4有2个端口,67号和68号端口分别为dhcp server和dhcp client服务端口. dhcp协议采用c/s模型,当

今日刷题总结20

C++的内存布局 在C++中内存被分为5个部分,分别是堆.栈.自由存储区.全局/静态存储区以及常量存储区. 自由存储区与堆的区别 堆是C语言和操作系统里的术语,它是由操作系统维护的一块特殊的内存,当C程序调用malloc函数进行动态内存分配时就是从堆上获取内存的,而调用free函数可以交还分配的内存.自由存储区是C++基于new和delete操作符的一个抽象概念,凡是通过new来申请的内存区域都可称为自由存储区.几乎所有的C++编译器默认都使用堆来实现自由存储区,即缺省的全局库函数operato