XJU-ACM协会2020国庆授课要点简录

10月1日到10月4日
ljs:c语言基础 前缀和 差分 
syx:c++基础stl或者排序二分 
wjq:分支归并,归并排序,双指针 
la: bfs + dfs
每天上午十点到1点半,下午三点半到晚上七点

 

ACM协会10月2日上午 培训录像 (暂时只有这个,其他录屏尚未上传)


10月1日:

李学长介绍了C语言的基本语法(如布尔类型、数组、结构体)、洛谷、acwing等等算法类网站,熟悉了Dev-c++编译器。并针对牛客编程语言练习赛第四场进行了讲解,重点讲解了“金字塔图案”和“空心三角形图案”。讲解了前缀和,并以洛谷题P5638为例进行了演示。

宋学长介绍了比赛中经常用到的C++的一些基本知识,比如控制输入输出流,万用头文件等等。

10月2日:

宋学长讲解了STL容器相关(如动态数组、映射、队列、双端队列、优先队列、栈、迭代器等等)知识,科普了ACM赛制和OI赛制的区别。提及了bfs(广度优先搜索}。介绍了时间复杂度和二分算法、sort函数。讲解了set与multiset之间的区别。介绍了宏定义。讲解排序函数时提及关键字,类比于EXCEL中的关键字。提及哈希算法。介绍了数组最大空间和O2优化。推荐了算法类书籍。

李学长带着做题,推荐了Codeforces和AtCoder等刷题网站。并建议大家在博客园开博客,养成写技术博客的习惯。

10月3日:

王学长以汉诺塔问题为例讲解了递归,讲解了归并分支和归并排序等等知识。下午主要带着一起做题,介绍了记忆化。

10月4日:

L_A讲解了逆波兰表达式、回溯、PFS(深度优先搜索)、BFS(广度优先搜索)等内容。ppt上漏了写退队。下午指导了一波洛谷题。


#include<algorithm>//加容器名字头文件?

vector<int>v; //声明int类型动态数组。动态数组不用分配大小。每个数组长度是动态的

vector<int>v[10];//二维数组 

v.push_back(i);//将i存入v

v.begin();//指向第一个迭代器(迭代器类似于指针,表示地址之用)

v.end();///指向最后一个迭代器(动态数组尾端的下一位)

acm赛制10~13题,一道就交,提交错误有罚时,拼手速

oi赛制,只交一次

sort(v.begin(),v.end());//排序函数,默认从小到大排序

sort(v.begin(),v.end(),cmp);

bool cmp(int a,int b){       //comp或cmp,自写从大到小排序

  if(a>b)return true;

  else return false;

}

二分算法

时间复杂度:

O(n),一个for

O(logn),二分算法

O(n^2),两个for嵌套

O(nlogn),排序最快

O(n^3),

set<int> s;  //集合,不允许出现重复元素。自动排序

multiset<int> ms;   //可存在重复元素

excel表格第一关键字、第二关键字

struct ljs{  //定义结构体

  int eng,che,math,tot;

};

bool cmp (const &a,const ljs &b){

  if(a.tot>b.tot) return true;

  else if(a.tot==b.tot){

    return(a.math>b.math);  //总分相同时返回数学高

  }

  else return false;

}

v.clear();  //清空容器

int a[10];

memset(a,0,sizeof(a));  //把数组清零

#include<string>  //C++string类成员函数

string s;

reverse(s.begin(),s.end()); //反转函数

queue队列,先进先出,只能从队尾插入,从队首弹出。front、back,不支持下标访问

deue双端队列,类似队列但可从队首插入

stack栈

priority_queue优先队列,队列放入后自动排序,默认从大到小。从小到大可通过存入负数实现

for(queue<int>::iterator it=q.begin();it!=q.end();it++){

  cout<<(*it)<<" ";

}

 1 /*
 2 背单词,会则输出yes,不会则输出。输入整数n,n行,每行一个数字(0或1)和一个单词。 
 3 0表示记忆单词,1表示询问记过没。对每次询问,输出yes或no 
 4 */ 
 5 #include<bits/stdc++.h>
 6 #include<set>>
 7 #define ll long long
 8 #define rep(i,a,b) for(int i=a;i<=b;i++)
 9 #define rpe(i,a,b) for(int i=a;i>=b;i--)
10 using namespace std;
11 set <string> s;
12 int main(){
13     int n;
14     cin>>n;
15     while(n--){
16         int x;
17         string word;
18         cin>>x>>word;
19         if(x==0){
20             s.insert(word);
21         }
22         else{
23             if(s.count(word)==0){
24                 cout<<"no"<<endl;
25             }
26             else{
27                 cout<<"yes"<<endl;
28             }
29         }
30     }
31     return 0;
32 }

set   lower_bound

  upper_bound

#include<map> //映射

map<type1,type2> m;

m[type1]=m[type2];  //建立映射关系

map[]下标可以是任意类型

哈希算法 

C++开O2优化

编译选项 ~std=C++14

紫书 刘汝佳 算法竞赛入门经典

        李煜东 算法进阶指南

int solve(int l,int r){

  if(l==r) return 1;    //递归一定要有终止条件,且终止条件

  int ans=solve(l,r-1);

  ans+=r;

  return ans;

}

int main{

  solve(1,100);

}

典型的递归:汉诺塔

分治:将问题分解到无法再分

int solve(int l,int r){

  if(l==r) return 1;

  int mid=(1+r)/2;

  int ans=solve(1,mid)+slove(mid+1,r);

  return ans;

}

归并排序

a.resize(n);

记忆化

int f[1000];

if(f[n]) return f[n];

return f[n]=ans;

hed=1;队列头,

tal队列尾

que[1][0]sn,行  que[1][]=sm;尾

原文地址:https://www.cnblogs.com/infocodez/p/13764973.html