0
点赞
收藏
分享

微信扫一扫

ACM第二周总结

写心之所想 2022-03-30 阅读 28

        闲聊一下:昨晚写程序设计B作业,只睡了2个小时,(我也沦落了需要最后一天才能交上作业了),虽然要求总结的是这周所学习的内容,但是还是想着继续把搜索这方面给巩固一下,因为我主要负责图论这一方面,所以下一周的话肯定要开最小生成树了(还不是因为我,这种光打codefores了,白天睡觉,就偶尔写了几道零零散散的题,我也不想仅仅只罗列知识点,但是总结题目的方式确实有利于我的理解)

开始正题:

一问:什么是搜索,搜索的本质是什么?

暴力将每一种答案都搜索一遍,找出符合条件的输出(在我看来就这样)

二问:我们在搜索时需要注意什么?

1.搜索是一个递归的过程啊,递归过程是要有出口的(出口我怎么去写)

2.VIS数组标记,标记过的点不再进行访问。

3.回溯的条件该如何去写。

基础的点:

算法笔记DFS总结1_钟一淼的博客-CSDN博客

两道例题:

解释一下我的思想:(我题目的分析应该都比较明确)

DFS:  

P1036洛谷选数_钟一淼的博客-CSDN博客

注意点:

1.回溯上,因为这边累加的和进行回溯操作。

2.单独设置一个变量进行记录访问到第几个数了。

BFS: 

P1135 奇怪的电梯(淼淼总结BFS)_钟一淼的博客-CSDN博客

注意:

1.BFS运用队列,多数需要定义结构体。

2.判断范围条件写好 ,一定得保证它在这一范围区域内进行搜索。

关于孤岛的问题:(面积扩张)

P1596 [USACO10OCT]Lake Counting S(DFS)_钟一淼的博客-CSDN博客

还是不停的搜索其他的相同的点,搜过的点标记出来即可。

搜索(进阶):

剪枝思想:

        搜索到一定深度时已经不满足于题目的条件,那继续往下搜索的内容肯定也不满足条件,直接return;不进行搜索,提升算法效率。

例题:

P1433 吃奶酪(DFS剪枝)_钟一淼的博客-CSDN博客

POJ 1419-Graph Coloring_钟一淼的博客-CSDN博客

二,蓝桥杯的总结:

(就一些算是小积累吧,这周确确实实没开大章,下周图论和最小生成树)

1.欧拉定理:

平面的增加=交点分割线段的个数。

蓝桥杯(平面切分)_钟一淼的博客-CSDN博客

2.动态规划基础问题:

基础点的话还是看我我上次写的博客:

动态规划入门_钟一淼的博客-CSDN博客

这次主要来介绍一下数字三角形

1.其实这一道题目是有一个基础版的->

P1216 [USACO1.5][IOI1994]数字三角形 Number Triangles - 洛谷 | 计算机科学教育新生态 (luogu.com.cn)icon-default.png?t=M276https://www.luogu.com.cn/problem/P1216题目分析:就是从下到上不停的更新加上左下值或者加上右下值,谁更大,更优!

状态转移方程: 

代码如下:

#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
int mp[1010][1010];
int main()
{
    int n;
    cin >> n;
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= i; j++) {
            cin >> mp[i][j];
        }
    }
    for (int i = n - 1; i > 0; i--) {
        for (int j = 1; j <= i; j++) {
            mp[i][j] += max(mp[i + 1][j], mp[i + 1][j + 1]);//更新最大值
        }
    }
    cout << mp[1][1] << endl;
}

2.进阶版本: 

数字三角形 - 蓝桥云课 (lanqiao.cn)

 代码如下:

#include <iostream>
#include <algorithm>
using namespace std;
int mp[1010][1010];
int main()
{
    int n;
    cin >> n;
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= i; j++) {
            cin >> mp[i][j];
        }
    }
    for (int i = 1; i <= n; i++) {
        for (int j = 1; j<=i; j++) {
            mp[i][j]+=max(mp[i - 1][j], mp[i - 1][j - 1]);
        }
    }
    if (n % 2 == 0) {
        cout << max(mp[n][n / 2], mp[n][n / 2 + 1]) << endl;
    }
    else {
        cout << mp[n][n / 2+1] << endl;
    }
}

        或许一些零零碎碎的知识点没什么大用,但就是单纯觉得积累一下会比较好,(其实这个是考研大的学长问我的,否则这星期就真的水过去了)。

三,Codefores比赛的总结

        先分享一下我的心得吧,我是真的菜啊(我看到同样是19岁,人家都已经上紫了),我还在与第三道题斗智斗勇,啊啊啊啊!

比赛总结:

Codefores CodeTON Round 1 (Div. 1 + Div. 2)比赛总结_钟一淼的博客-CSDN博客

 基本需要注意的点都已经写好了,还是算法的优化和数学思维的掌握吧!

关于STL如何降低复杂度?

Codefores CodeTON Round 1 B题_钟一淼的博客-CSDN博客

这里利用了map函数进行优化;

也可以用vector进行优化:(算是STL的一个广泛应用)

#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
 
int main() {
    int t;
    cin >> t;
    while(t--) {
        int n, a;
    	cin >> n >> a;
    	vector<int> v(n);
    	for(int& x : v) cin >> x;
    	bool ans = false;
    	if(n == 1) ans = (v[0] == a);
    	else {
    		sort(v.begin(), v.end());
    		int i = 0;
    		int j = 1;
    		while(j < n and i < n) {
    			if(v[i] + abs(a) == v[j]) {
    				ans = true;
    				break;
    			}
    			else if(v[i] + abs(a) < v[j]) ++i;
    			else ++j;
    		}
    	}
    	if(ans==true){
            cout<<"YSE"<<endl;    
        }else{
            cout<<"NO<<endl;            
        }
    }
}

贪心思想:

总结的一个小题:

Codefores教育代码第125轮C题_钟一淼的博客-CSDN博客

四,周总结

        这周真没学什么很系统的东西,还是主要复习了复习搜索的知识点,练了一些题目,虽然阅读的东西很多,但我总觉得我没有吸收进去,所以这周才更加仔细的推敲某些题目,更加深入的了解,零零碎碎的一些东西就全当是积累了,毕竟数学的内容挺多的,还是需要定时积累的,下周的话就赶新课,最小生成树,不能松懈,继续坚持。

举报

相关推荐

ACM寒假第二周总结

ACM第二周训练

第二周总结

第二周学习总结

JS第二周总结

寒假第二周总结

ACM第二次总结

python第二周学习总结

acm第五周总结

第七周ACM博客总结

0 条评论